0

私はプロジェクトでドメイン駆動設計の原則を適用したいと思いますが、従属モデルのビジネスロジックで何をすべきかを判断できませんでした。複雑なマルチドメイン関連のロジックを配置する:サービス層またはモデル自体に?

たとえば、このシナリオを想定します。
私はPersonCarのドメインモデルを持っています。各人は年齢/予算/嗜好などに基づいて特定の車をDBから購入するのに適しています。私のモデルでは、この人にふさわしい車リスト(SuitableCars)を持っていたいと思います。

public class Person 
{ 
    public List<Car> SuitableCars {get; set;} 
} 

しかし、今それを行うためには、私は(リポジトリとDI)をDBからデータをフェッチするために、サービスメソッド(GetSuitableCarsForPerson)を呼び出す必要があり、私の(時にはかなり複雑なマルチモデルに依存)カスタムロジックを実行します車を取得します。

public class PersonService : IPersonService 
{ 
    private IRepository _repo; 

    public PersonService(IPRepository repository) 
    { 
     _repo = repository; 
    } 

    public List<Car> GetSuitableCarsForPerson(Person person) 
    { 
     // business goes here right now. 
    } 

} 

のでSuitableCarsプロパティの宣言はなります:

私の知る限り
private IPersonService _personService; 
public List<Car> SuitableCars 
{ 
    get 
    { 
     // I have to inject a PersonService in my model. Bad practice? 
     return _personService.GetSuitableCarsForPerson(this); 
    } 
} 

、サービスが薄く維持されなければならない(ref)とあなたがそれらにない-ドメインモデル関連のビジネスを入れてみましょうするために使用されています。しかし私は、私が記述したような論理はモデルそのものに属すると信じています。

関連するモデルにアクセスし、さまざまなカスタム検証/フィルタを実行して適切なデータを取得する必要があるこれらの種類のロジックをどのように処理するのですか?
ありがとうございます。

答えて

0

人のための適切な車のセットの定義のように人のモデルの外の要因に依存し、人とは独立して変更することができます。適切な車のセットは、人の好みだけでなく、すべての車のセットにも依存する。車のセットは人とは無関係に変化するので、所定の人のための適切な車のセットは、適切な車のセットを決定する操作のキャッシュである。これらの所見は、レポジトリまたはドメインサービスが適切な車のセットを返すべきであり、人と適切な車のセットとの間の関連付けは、人のモデル上で直接表現されるべきではないことを示している。人モデルに直接表現するための適切な関連付けは、人が優先モデルとして指定した車のセットです。この場合、人はこのデータの「所有者」です。 DDDでは、モデルやリポジトリを使用して直接関連付けを表現し、特定のアプローチを選択することは、いくつかの要素が上で概説されているかどうかによって異なります。モデルを設計する方法の詳細については、this series of articlesをご覧ください。

関連する問題