1

nHibernate、Spring、WCFを一緒に使用しようとしています。私はOrderオブジェクトを持っています、そしてそれはオブジェクトを含んでいCustomerます。

findOrderサービスでWCFメソッドを呼び出すことができますが、 Order'sフィールドにアノテーションCustomerがない場合、Webサービスは必要なものを返します。ただし、予想どおり、詳細は含まれていません。DataMemberOrderCustomer

しかし、も含めようとするとCustomer、WebServiceが失敗し、WCFトレースログを見ると、次のエラーが表示されます。

System.Runtime.Serialization.SerializationException:タイプ「DecoratorAopProxy_95d4cb390f7a48b28eb6d7404306a23d」、データコントラクト名「DecoratorAopProxy_95d4cb390f7a48b28eb6d7404306a23d:http://schemas.datacontract.org/2004/07/」は予期されていません。DataContractResolverを使用するか、既知のタイプのリストに静的に不明なタイプを追加することを検討してください。たとえば、KnownTypeAttribute属性を使用するか、DataContractSerializerに渡される既知のタイプのリストに追加します。

これは、顧客に追加のnHibernateの詳細が含まれているためですが、WCFが喜んで送信する理由はわかりませんが、は送信しOrderませんCustomer

誰かが私を理解するのを手伝ってもらえますか?

注文オブジェクト

[DataContract]
[KnownType(typeof(Customer))]

public class Order
{
  // Standard properties
  [DataMember]
  public virtual int Id { get; set; }

  public virtual Enums.OrderStatus Status { get; set; }        

  [DataMember]
  [StringLength(20, ErrorMessage = "Order name must not be more than 20 characters long")]
  public virtual string Name { get; set; }

  [DataMember]
  public virtual Customer Customer { get; set; }

  [DataContract]
  ...
}

顧客オブジェクト

public class Customer
{
    public virtual int CustomerId { get; set; }

    [DataMember]
    private string name = "";
    ...
}
4

1 に答える 1

3

データ転送オブジェクト(DTO)を使用して、ネットワーク経由でデータを取得する必要があります。ドメインモデルをアプリケーションの境界に(そして境界から)漏らしたくないので、これはとにかく良い習慣です。

ドメインモデルを変更するたびにデータコントラクトが変更され、新しいものが作成wsdlされ、クライアントが変更されるなどのことを考えてみてください。さらに、あなたはあなたのサービスの消費者にあなたのアプリケーションのあまりにも多くの洞察を伝えています。

このすべてのアーキテクチャの何とか何とかにもかかわらず。NHibernateはプロキシを使用して遅延読み込みを有効にします。これらのプロキシは、シリアライザーが期待するものとは別のタイプです。ドメインの遅延読み込みを無効にして、アプリケーションを機能させることができます。これは私見悪い考えです。

<class name="Customer" table="tzCustomer" lazy="false" >
于 2012-04-27T13:35:46.367 に答える