2009-11-24 7 views
11

DDDの方法論を勉強してから、私は今、私の会社の実際の製品にこれらのコンセプトを適用し始めました。実際、私は、将来の開発のための適切で維持可能なアーキテクチャを作成することが任されています。 NDD開発におけるDDDのコンセプト

は、我々は以下の技術を利用することにしました:EF4(本当にV2)、ユニティ

私が最も啓発されている得られた情報の量は、しかし、私は最高のいくつかの疑問が残っています実践:

質問#1:のDTO - ベストプラクティス

私は私のドメインオブジェクト(POCOクラス)を持っています。これらのクラスを実装する方法はいくつかあります。

  1. 従来のアプローチ:公共ゲッター/セッター、検証、&適切なビジネスロジックを含むPOCOクラスを作成します。また、DTOを作成し、マッピング技術を使用してDTOを管理します。
  2. 従来のDTO:上記のようなPOCOクラスを作成しますが、POCOを転送オブジェクトとして使用します。ビジネスオブジェクトは決してドメインから離れるべきではないということは私の理解です。
  3. ハイブリッド:著者が自分のPOCOオブジェクトとDTOを作成する面白いblog postを見つけました。彼のドメインオブジェクトの中で、彼はDTOのインスタンスを作成します。 #1のようにプロパティを複製しないので、メンテナンスが容易になります。これと同じように:
 
public abstract class POCOBase<T> : ValidationBase, IPOCO where T : DTOBase, new() 
{ 

public T Data { get; set; } 

public POCOBase() 
{ 
    Data = new T(); 
} 

public POCOBase(T dto) 
{ 
    Data = dto; 
} 
    } 

    public class SomePOCO : POCOBase { } 

    public class SomeDTO : DTOBase 

    { 

public String Name { get; set; } 

public String Description { get; set; } 

public Boolean IsEnabled { get; set; } 
} 


// EXAMPLES 
// POCOBase<SomeDTO> somePOCO = new SomePOCO(); 
// somePOCO.Data.Name = "blablabla"; 
// somePOCO.Validate(); 
// return somePOCO.Data; 

質問#2:何のオブジェクトは、UI /サービスレイヤによって返されるべき?

これはDTOの全体点です。裸の属性だけを含む非常に単純で軽量のオブジェクト。それには検証結果も含まれていません。 DTOをクライアントにシリアル化している場合は、クライアントがInvalidRulesコレクションのような検証結果を必要とすると仮定します。

たとえば、AmazonのAPIを使用しているとします。私は私の個人的な店に本を追加したいと思う。 ISBNを送信せずに本を追加しようとすると、サービスはおそらく検証結果のエラーを含む何らかの応答グループを返すでしょう。

何か不足していますか?私は、DTOにビジネスロジックが含まれてはならないという印象を受けました(少なくともDDDの "純粋主義者"から)。 DTOは転送オブジェクトとして十分な情報を提供していないようです。それともDTOと検証結果をカプセル化する新しいタイプのResponseオブジェクトが必要です。

質問#3:IoCはどれくらいですか?

「異なるアプリケーション の部分を識別し、同じまま、それらの は別に:

私が黄金のルールに従うべきであると私には明らかに思えます。「私には

これは、依存関係を減らすために。のIoCを適用するという点で理にかなって私のプレゼンテーション、ビジネスロジック、およびデータアクセス層の全ては、IoCコンテナを介して通信する。私のアプリケーション層は、共通のインタフェースと抽象化が含まれています。それはそうです私は疑似テストリポジトリを作成することが大好きです。Unityの設定を変更するだけで、私はTDDを利用できます。

私はこれらの質問を明確にしたいと思います。ありがとう

+2

将来的には、それぞれの質問を別々のStackOverflow質問としてください... –

答えて

18

私はあなたの質問に1つずつ答えようとします。

彼らは、アプリケーションのアーキテクチャの異なる場所で異なる目的を果たすため

回答は1つの

のDTOはDDDに直交しています。つまり、DTOは動作していないため、Anemic Domain Modelsにつながるため、ドメインモデルには存在しません。

持続性を備えたPOCOは無視されます。ジェレミーミラーは良いarticle that explains this conceptを持っています。ドメインモデルの上に座って

回答2

レイヤーは、多くの場合、問題の目的のために合わせて調整され、独自のオブジェクトを返す必要があります。

UIの場合、MVVMパターンは特にうまく機能します。 This articleでは、WPF用のMVVMが導入されていますが、パターンはASP.NET MVCの魅力のようにも機能します。

ウェブサービスでは、これがDTOパターンが適用される場所です。

これは、サービスインタフェースとドメインモデルとの間で多くのマッピングが必要になりますが、これはSupple Designの支払いに必要な価格です。この場合、WCFデータ契約はDTOです。この点に関してはAutoMapperが役に立ちます。

よりIoCの回答3:あなたの質問についてよりよく、しかし、一つのことが私を襲った(本当にDI):DIコンテナが唯一のオブジェクトグラフを配線して、道から抜け出す必要があります。オブジェクトはDIコンテナに依存すべきではありません。

詳細はthis SO answerを参照してください。

+0

コメントありがとうございます。 ドメインオブジェクトにビジネスロジックがない場合、貧血ドメインモデルが発生することは私の理解です。彼らはゲッター/セッターの袋のままです。 ADMのもう一つのポイントは、論理(検証など)が、オブジェクトの内部ではなくオブジェクトの外部で発生する場合です。 質問#1に戻ると、永続的な無知のドメインオブジェクト内にDTOインスタンスを作成するハイブリッドアプローチが、必ずしもそれを貧血ドメインモデルとしているわけではありません。あなたはDDDプリンシパルを破るという点では正しいです。私はおそらくこれをもう少し掘り下げなければならないでしょう。 – Daniel

+0

回答2は完璧でした。カスタム返品オブジェクトを作成する必要があるかもしれないという傾向がありました。 MVVMに関するアドバイスをいただきありがとうございます。 – Daniel

+0

私は現在、自分のASP.NET web.configでDIコンテナを設定していますが、Global.asaxを使って設定しています。 あなたの答えがわかりましたら、私はあなたを正しく理解しています: TDDメソッドを実装するには、DIの設定をメソッド自体に「オンザフライ」で登録するだけです。 – Daniel

関連する問題