2016-05-11 10 views
1

DDDで初めてです。会社では、「ドメインマスター」はありません。私はDDDについて読んだだけですが、私はDDDでドメインを実装する必要があります。DDD - ポコ。最初のステップ

ドメイン内にデータベース機能がないことがわかりました。しかし、Entity FrameworkとNOSQLデータベースで自分のドメインを使用する場合は、 EFでは、コレクションをバーチャルにして、コンストラクタアロスを新しいものにする必要があります。これはDDDでは悪いですか?

マイコード:DDD空間でその問題について

public abstract class Merchant : AggregateRoot 
{ 
    public Company Company { get; set; } // Entity 

    public string CIF { get; set; } 
    public string NIP { get; set; } 
    public string Status { get; set; } 

    public Address Address { get; set; } // Entity 
    public Group Group { get; set; } // Entity 
    public virtual ICollection<Brand> Brands { get; set; } // Brand is entity 

    protected Merchant() 
    { 
     this.Brands = new List<Brand>(); 
    } 
} 
+0

なぜ抽象クラスですか? – guillaume31

+2

Yuuは** DDDで**何かを実装していないので、あなたは** DDDでドメインモデル(抽象化)を特定し実装されています。 DDDの終了後にコーディング(設計を含む)が開始されます。 – MikeSW

+0

注意:ドメインエキスパートにアクセスできない場合は、プロジェクトが本格的なDDDアプローチを正当化するのに十分なほど重要であるかどうかは不明です。 「我々は組織が競争上の優位性を獲得する分野でドメイン駆動型設計を使用しています。 (Greg Young、2001) – VoiceOfUnreason

答えて

4

ありmultipleshadesofopinion。私に

は、「永続無知」の主な指標は以下のとおりです。

は私のデータベースの変更は、ドメインモデルを開いて修正するものを変更するために私を を強制的に、私のドメイン層で物事を中断しますそれ ?

あなたの例を見れば、答えは明らかにノーです。あなたは、テーブルまたは列の名前を参照するエンティティ・クラスの例のデータ注釈のために持っていた場合

それはケースだったでしょうか、慣例によりマッピングに依存していましたし、DBにResellerMerchantテーブル名を変更した場合。しかし、デフォルトのコンストラクタと仮想プロパティを持っていても、データベースの変更があっても、ドメインクラスは壊れにくくなりません。

その後、あなたはIMO二次質問、重要度の低いものを持っている:彼らはする必要があるとして、

はORMはちょうど私が欲しい 方法とDDD準拠としての私の実装ドメインエンティティにおける障害ですか?

これはもう少し難しいです。 ORMによって、ドメインオブジェクトを矛盾した状態にすることができる操作を追加する必要がある場合には、その可能性があります。私はパラメータのないコンストラクタはプライベートにすることができ、それで足で自分自身を撃つことは不可能なので、それに陥りやすいとは思わないでしょう。セッターと同じ。

エンティティが純粋ではなく、ORMの存在によって奇妙なものが含まれているため、仮想およびパラメータのないコンストラクタの必要性などの小さなトレースがDDDに違反すると考えている人もいます。したがって、2番目の「パーシスタンス」モデルを作成して、ドメインモデルをそのままにしておく必要があります。私はしません。ほとんどの場合、複雑さの面でトレードオフの価値がないと思います。永続性の無知の第一のルールが成立する限り、小さな奇妙なもので生きることができます。

+0

プライベートセッターと非公開のデフォルトコンストラクターは問題ありません。彼らは決して問題ではありません。一方、子は集約されます。私たちがカプセル化を取り入れた世界では、それらは公開されるべきではありません(ルート集約がその状態を制御していることを確認するため)。しかし、ORMの通常は不動産が必要なため、ORMの課題は非常にあります。私の目には、非公開の財産がコードの臭いです。思考? – jgauffin

+1

あなたは子供の実体を意味します、そうですか?はい、それは、いくつかのORMベンダーがより良い仕事をすることができることを私たちに示すコード臭です。私はそれを解決するためにインダイレクションのまったく新しい層を導入する必要があるそのコード臭に他の解釈では売られていません。 – guillaume31

+0

より正確に言えば、「持続性モデル」の特定に失敗したと考えられるコードの匂いの解釈です。 – guillaume31

0

私は、保護されたデフォルトのコンストラクタまたは仮想プロパティよりもパブリックセッタを持つことに心配しています。その問題は、エンティティの矛盾した状態につながる可能性があります。たとえば、住所のプロパティを検証して、必要なプロパティがすべて設定され、郵便番号が州/国に対応していることを確認することができます。もう1つの例は状態遷移です。エンティティが「最終」ステータスに達すると、それはもはや変更できません。

エンティティに対して別々のバリデータを作成し、エンティティを永続化する前に使用することはできますが、リッチドメインモデルの目的に反します。

回避策はいくつかあります。データベースのスキーマを反映するDTOオブジェクトを作成し、ハイドレーターを使用して、データベース内のデータが常に一貫性のある状態にあると仮定して、DTOからエンティティ(保護された/内部プロパティーセッターを持つ)を設定できます。新しい変更はすべて、エンティティメソッドを経由して検証される必要があります。次に、最新のエンティティデータに基づいてDTOを水和し、それを保持します。

CQRS with event sourcingは、最新のデータスナップショットではなく、不変のログ/イベントストアとしてすべての変更を維持する、これよりも高度な代替方法です。しかし、それはすべてのドメインのシナリオに必要なものではありません。

関連する問題