13

WCFサービスを介して公開するオブジェクトに関連して何が意味があるのか​​疑問に思っています-ビジネスエンティティにWCFシリアル化仕様を追加する必要がありますか、それともビジネスエンティティをWCFを介して公開するDataContractsにマップするコンバーターを実装する必要がありますサービス?

現在、DataAccess、Business、Contractのさまざまなレベルのエンティティがあります。DataAccessからBusinessに、およびBusinessからContractに、またはその逆にエンティティをマップできるコンバーターを配置しています。それらの実装と保守は時間がかかり、かなり面倒です。これに関連するベストプラクティスは何ですか?

NHibernateやEntityFrameworkなどのOR/Mを使用していた場合、ORMからエンティティを直接公開する必要がありますか、それとも現在と同じ方法で抽象化する必要がありますか?

4

4 に答える 4

12

一般に、ベスト プラクティスの観点から、ビジネス オブジェクトの構造をデータ コントラクトとして公開するのではなく、「データ コントラクト固有の」クラスを定義し、ビジネスをコントラクトに変換する必要があると思います。追加の作業が必要になる場合がありますが、関心の分離と変更からの保護の観点から、追加の作業はおそらく価値があります。

Microsoftのパターン & プラクティス "Service Factory Modeling Edition"はこれを実装し、ビジネス <=> コントラクト コンバーター クラスを自動生成するツールも提供します。これは優れた VS アドインであり、Microsoft の WCF のベスト プラクティスも表しています。

于 2008-09-17T14:27:20.177 に答える
4

私は通常、単一責任の原則 (srp) を順守したいので、自分のビジネス/データ エンティティをネットワーク経由で公開しません。説明するために、データ エンティティは、基になるリレーショナル (db) モデルにマップするために作成されました。したがって、「変更」する必要がある唯一の理由は、リレーショナル モデルへの変更のためです。それだけです。

そのようなエンティティを公開してネットワークを通過できるようにすると、エンティティは 2 つの目的を果たします。やり過ぎのように思えるかもしれませんが、物事をよりクリーンで透明に保ちます...これにより、よりシンプルなデザインが得られます.

于 2008-09-17T14:27:26.650 に答える
1

上記の回答に追加するだけです。Web サービスが公開するオブジェクトは、データ転送オブジェクト (DTO) と呼ばれます。ビジネス エンティティ オブジェクト (BEO) をマップするための DTO を持つことは、Web サービスと Web サービスの背後にある実際の実装/ロジックを分離できるため、優れています。

最後に、DTO が WSDL によって公開されたときに、それが表す実際のオブジェクトを名前が反映するように DTO を装飾する方法を次に示します (objectNameDTO やそのような醜いものではなく)。

//Business Entity
class Person
{
   public string Name{ get; set; }
   public int Age{ get; set; }
}


//Data transfer object
[DataContract(Name="Person")] //<-- this is what makes the WSDL look nice and clean
class PersonDTO
{
   [DataMember(Name = "Name", Order = 0)]
   public string Name{ get; set; }
   [DataMember(Name = "Age", Order = 1)]
   public int Age{ get; set; }
}
于 2010-03-08T16:47:58.030 に答える
1

また、考慮すべき点として、私は分離に同意しますが、通常は「トランスレーター」またはそのようなコードにつながり、DTO からビジネス エンティティにデータをコピーします。これは、AutoMapper ( http://automapper.org/ ) のようなライブラリが本当に便利で、翻訳層を書く必要がない場所です。

于 2012-08-13T17:05:16.310 に答える