殴打されて死んだと思われる方は、あらかじめお詫び申し上げます。私はここ数時間、ここSOで多くの優れた投稿を検索して読んだばかりですが、それでも混乱しています。
私の混乱の原因は、DTOとDDDおよびリポジトリです。POCOドメインオブジェクトにスマートを持たせ、リポジトリから取得したいと思います。しかし、それを機能させるには、いくつかのカプセル化ルールに違反する必要があるようであり、DTOを彼らの頭に向けることができるようです。
簡単な例を次に示します。カタログアプリケーションでは、パーツは他の多くのパーツを含むパッケージである可能性があります。したがって、Part POCOがIEnumerable<Part>を返す'GetChildren()'メソッドを持つことは理にかなっています。それは、その途中でリストを使って他のことをするかもしれません。
しかし、そのリストはどのように解決されますか?リポジトリが答えのようです:
interface IPartRepository : IRepository<Part>
{
// Part LoadByID(int id); comes from IRepository<Part>
IEnumerable<Part> GetChildren(Part part);
}
と
class Part
{
...
public IEnumerable<Part> GetChildren()
{
// Might manipulate this list on the way out!
return partRepository.GetChildren(this);
}
}
そのため、私のカタログの利用者は、リポジトリからパーツを(正しく)ロードすることに加えて、GetChildren(part)を直接呼び出すことで、パーツでカプセル化されたロジックをバイパスすることもできます。悪くないですか?
リポジトリはPOCOを提供する必要があるが、DTOは「レイヤー間」でデータを転送するのに適していることを読みました。多くの部品プロパティが計算されます。たとえば、価格は複雑な価格設定ルールに基づいて計算されます。価格はリポジトリからのDTOにも含まれません。したがって、価格データをWebサービスに戻すには、DTOがパーツを消費する必要があります。その逆ではないようです。
これはすでに長くなりすぎています。頭を緩めたところはどこですか?