これが死に至ったと考えている人は、事前に謝罪します。私はちょうど最後の数時間を探して、ここで多くの優れた記事を読んで過ごしましたが、私はまだ混乱しています。DDD、Repository&Encapsulation
私の混乱の原因は、DTOとDDDとリポジトリです。私は私のPOCOドメインオブジェクトにスマートを持たせたい、そしてリポジトリからそれらを取得したい。しかし、私はその作業をするためにいくつかのカプセル化ルールに違反しなければならないようで、DTOを頭の中に変えることができるようです。
ここでは簡単な例を示します。私たちのカタログアプリケーションでは、Partは他の多くの部品を含むパッケージです。したがって、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'sに役立つはずですが、DTOはレイヤ間のデータ転送に適していると読んでいます。部品プロパティの多くが計算されます。たとえば、価格は複雑な価格設定ルールに基づいて計算されます。価格はリポジトリからのDTOには含まれないため、価格データをWebサービスに戻すことは、DTOがPartを消費する必要があります。
これは既に長くなっています。私の頭はどこにあるの?
興味深い。しかし、私は「GetChildren(part)をIPartServiceに移動してpartから削除する」と「PartクラスにはまだChildpartsプロパティがあります」と混乱します。なんらかの理由で子供がマッサージする必要がある場合はどうすればいいですか? – n8wrl
マッサージをリポジトリから取得した直後に行う必要がある場合は、そのロジックを 'IPartService.GetChildren()'に入れます。子要素を任意の時刻に変更できるようにする必要がある場合は、 'IPartService.UpdateChildPartPrices(Part part) 'のような別のサービスメソッドを作ることができます(または両方とも' GetChildren'から 'UpdateChildPartPrices'を呼び出すことができます)。 –
時間をとってくれてありがとう、ジェフ! – n8wrl