2009-06-02 3 views
5

たとえば、2つのドメインオブジェクト、CellとBody(人間の細胞とボディの場合のように)があります。エンティティがコンテナにコンテナを追加するエンティティを複製するとき、ドメイン駆動型設計では?

Bodyクラスは単なるCellsのコレクションです。

class Body 
{ 
    IList<Cell> cells; 
    public void AddCell(Cell c) { ... } 
    public void RemoveCell(Cell c) { ... } 
} 

セルにはスプリット(Split)メソッドがあり、内部的に自分自身のクローンを作成します。 DDDで今

Class Cell 
{ 
    public Cell Split() 
    { 
     Cell newCell = new Cell(); 
     // Copy this cell's properties into the new cell. 
     return Cell; 
    } 
} 

、セルの分割は、必要がある場合:

  1. セルは、(各Cellオブジェクトは、それを含む身体への参照を開催したことを意味している)のボディに、新しく作成されたセルを追加しますか?
  2. または、インサイトユーザリクエストを受信したサービス層がSplitをコールし、返されたCellを収集して本文に追加する必要がありますか? (ドメインオブジェクトではなくコントローラを使用するより貧血的なデザインのように感じる)
  3. BodyにSplitCellメソッドが含まれている必要がありますか?

ありがとうございます。

答えて

0

ドメイン駆動設計(エヴァンス)を読んだ後には、このシナリオが最善であるように思わserviceを使って対処しました。

1

DDDでは、よくドメインに依存することがよくあります。ここでは、例 - とドメイン - はちょっと変わっているようですが、BodySplitCellメソッドに行くと思います。

細胞分裂が何を意味しているのか、そしてこの行動を引き起こすべきことは私にはあまり明確ではありませんが、体が細胞を分裂させる原因になると思います。 BodyRegenerateメソッドなどのように、内部セルを分割してそれぞれのメソッドでSplitメソッドを呼び出すことで、より快適になります。

[OK]を、この例では、決定的に奇妙である...

+0

セル分割では、1つのマイナーな違いを持つセルの正確なコピーが作成されます。セルを認識しているシステム内の別のアクタが分割をトリガします。この俳優は体の存在を本当に知らない。 – ng5000

+1

私がモデリングしている実際のドメインより奇妙な例を説明するのは簡単です。私は、私が扱っている問題の簡単な抽象的な例でそれを試してみました。 – ng5000

2

私は、体が単にセル上splitCell()を呼び出すだろうと思うだろう。それで、ボディは新しいCellで望みのことをすることができます - それ自体に追加し、消費し、それを放棄します。とにかくボディにはセルが含まれています。

2

[OK] - もう1つの方法は、「私は分裂している」などと言っている身体にイベントを送信することです。 Bodyは、新しいCellを、おそらくそのイベントのペイロードとして取り上げることができます。

外部の俳優が身体について知らない場合、Splitメソッドは新しいCellクローンを返す必要がありますか?外部の俳優はこれをどうにか使うつもりですか? Splitメソッドは何も返さず(Void)、それが住んでいる本文にメッセージを送信するだけですか?

1

Cellクラスのイベントを使用するのは自然な解決策のようですが、C#で実装するのは難しいです。

Cellsがスコープに入ったときにイベントを接続する必要があります。スコープから外に出たときにそれらをアンフックする必要があります。そうしないとメモリリークが発生します。

セルがBodyに再関連付けされるたびに、つまりセルが永続ストアから取得されるときにはいつでもイベントをフックアップする必要があります。リレーションシップ(おそらくORMインターセプタ)を管理するためにコンテナを使用すると、これを簡単に行うことができます。

シンプルな代替は、(細胞は右のみ、単一Bodyに属している?)親Bodyへの参照を保持し、それはBodyだと新しいCellが自分自身を追加できるようにすることです。

  • 長所:コード作成、デバッグ、理解が容易です。
  • 短所:セルとボディは密結合となり、他の文脈で再利用するためにそれらがトリッキー作る(無関係な場合もある)
+0

こんにちは、ありがとうございます。以前のようなイベント管理の状況を扱ってきました。あまりにもトリッキーではなく、常にエラーのための部屋。 – ng5000

+0

私は既に、セルが最適化のためにボディ(もちろん、IBodyに)へのリンクを持つことに決めました。私はそのリンケージに関するSOの質問をしました:http://stackoverflow.com/questions/920158/avoid-circular-reference-in-domain-model – ng5000