5

スマートオブジェクトプロパティが変更された場合、元のプロパティ値を認識するすべてのドメインオブジェクトを検討します。 スマートオブジェクトは通常、基本クラスを持ち、GetPropertyValue/SetPropertyValueメソッドを使用してプロパティを実装します。一方、POCOオブジェクトは通常、基本クラスを持たず、単純なプロパティを実装します。ドメインオブジェクト - "スマートオブジェクト" vs POCO

public class SmartObject : BaseDomainObject 
{ 
    public int id 
    { 
     get { return (int)this.GetPropertyValue("Id"); } 
     set { this.SetPropertyValue("Id", value); } 
    } 
} 

public class POCO 
{ 
    public int id { get; set; } 
} 

私はスマートオブジェクトが好きです。私にとっては大変な作業です。私は簡単にBaseDomainObjectにこれらすべての便利な機能を追加し、すべての私の派生ドメインクラスでそれらを持つことができます(ID、ステータス...など)

  • 共通のプロパティ
  • (変更なしに変更、新しい、)オブジェクトの状態の追跡します
  • すべてのプロパティは、私が役立つことができ、すべてのこの他の振る舞い持つことができます(私はめったにこれは便利ませんが)
  • 派生クラスが自動的に
  • 、シリアライズすることが可能プロパティの変更(INotifyProperyChangedの実装)にイベントを発生させる - /クローンをSync/IsPropertyDirty ...

一方、POCOは非常に単純であり、どの基本クラスにも依存しません。

今日では、ここで私ので、賞賛POCOの多く:それは

  • (通常はJSONなどのWebブラウザに)ワイヤ上で送信することができます

    1. それは他に純粋

    です私は上記の理由が間違いであると考えています:

    1. DTOは電信送金のためのものであり、ドメインオブジェクトではありません。ドメインオブジェクトがJSONにシリアライズされたときに失われたデータをカプセル化する動作。
    2. ロジックを持たないさらに貧血のドメインモデルやそれにスマートなものは何も付いていません。

    このすべてが悲しいことに、私はまだそのポコが好きで、それは私にバグです。あなたの意見は何ですか?

  • +2

    リッチドメインモデルの場合は、汚染させないでください技術的インフラの懸念があります。あなたが言及したすべてのもの - 状態追跡、プロパティ変更イベント、シリアライゼーション - これらのどれもドメインとは関係ありません。彼らはビジネスドメインの複雑さをモデルにエンコードすることは何もしません。 – MattDavey

    +0

    一方、POCOはドメインの複雑さをモデルにエンコードすることも何もしません。だから、DDDの基準では、両方のアプローチが非常に悪いです。 – MattDavey

    +1

    @MattDaveyあなたの最初のコメントに同意しますが、後者についてはわかりません。 POCO!=あなたが暗示しているのであれば貧血です。プレーン・オールド・オブジェクト・オリエンテッド*は、データに加えて、動作、および該当する場合はドメインの動作を含みます。 – guillaume31

    答えて

    4
    • (ID、ステータスのような...)共通のプロパティ

    、たとえば、Idプロパティを定義するEntity基本クラスです。エンティティは定義上、SRPを壊さず、サードパーティの動作をインポートしてオブジェクトの「純度」を変更しません。

    ステータスは、議論の余地があります。それは、あなたのオブジェクトにPOCOではない追加の責任が実際に導入される可能性があるということに依存します。

    あなたが言及したほとんどのプロパティは、ドメインオブジェクト自体ではなく、外部オブジェクトによって処理されるべきだと思います。

    • オブジェクトの状態(新規、変更、変わらず)追跡

    は、あなたのドメインオブジェクトの変更の追跡 - 専門のプロキシを持っている方が良いでしょうが、これはオームズは何をすべきか、一般的である(これを処理します)。

    • すべてのプロパティは、私はあなたのプレゼンテーションオブジェクトではなく、あなたのドメインオブジェクトに入るなど、主にUI関連というものを見プロパティの変更(INotifyProperyChangedの実装)

    にイベントを発生させます。エンティティのすべてのプロパティを観測可能にすることは望ましくありません。集約内の変更を通知するには、代わりにドメインイベントを使用します。

    • 私が役立つことができ、すべてのこの他の振る舞いを持つことができます - クローン/同期/ IsPropertyDirty ...

    クローンは通常、それらが考慮されることなく、値オブジェクトの基本的な動作をすることができ非POCOs。ドメインの特定の必要性を除いて、複製エンティティは私にとってあまり役に立たないようです。 Sync/IsPropertyDirtyは、バージョン管理/変更の追跡のように見え、特殊なオブジェクトに委任する必要があります。さらに貧血ドメインのためのチェイスのような純度の縫い目ロジックやそれに接続されているスマートは何も持っていません モデルの

    この追撃。

    ここでの問題は、すべて「添付」です。 SRPに準拠したオブジェクトはスマートではなく、という自然な責任を持たないスマートなものは含まれていません。同様に、POCOはダムではなく、外部ソースからの振舞いに移植されていないオブジェクト(3Dパーティライブラリ、フレームワークエクステンションなど)

    +1

    +1 "あなたのエンティティのすべてのプロパティが観測可能であることを望まないでしょう - 集約内の変更を通知するために代わりにドメインイベントを使用してください。" – MattDavey

    +0

    私は特に、どのように用語 "添付" **が問題自体を明らかにしたのが好きです。 – Vukoje

    +0

    また、MSILの世代では、データがオブジェクトに格納される方法を変更することなく、簡単に他のコンポーネントに委譲することができます。例:[EmitMapper](http://emitmapper.codeplex.com/)。 オブジェクト内の状態を追跡することで問題が発生する傾向がありますが、通常はいくつかの極端な技術が必要なため、ORM状態の追跡に完全な依存関係はありません。しかし、幸運なことに、新しいオブジェクトのための0であるIdプロパティは、ログになります。 – Vukoje

    1

    これらの「スマートオブジェクト」は非常に複雑であるため、私はモデル内にPOCOを貼り付けています。モデルは、ビジネスロジックだけを持ち、汚染されていないとなる可能性があるので、それが得られるほどシンプルでなければなりません。それだけで継承する場合、私は非POCOするオブジェクトを考えていない。特に技術的な1 ...