2

ドメイン駆動設計を使用してアプリケーションを開発しています。私が使用しているパターンの1つは、リポジトリパターンです。簡単にするために、次のクラスとインターフェイスがあるとしましょう。

Car-車のドメインの概念を表すドメインクラス。

public class Car {
  public int Id {get;private set;}
  public string SomeUniqueCode {get;private set;}
}

ICarRepository-Carオブジェクトへの変更を追加、削除、または保存するためのインターフェース。

public interface ICarRepository{
  Car  AddCar(Car c);
  void DeleteCar(Car c);
}

私の問題は、データベース内のすべてのCarオブジェクト間でSomeUniqueCodeプロパティの一意性を確認する方法です。そのプロパティは、オブジェクトのライフサイクル中いつでもユーザーによって変更されます(自動生成されません)。もちろん、1つの解決策はデータベースに一意のキーを配置することですが、それはDDDの原則ではありません。単一のオブジェクトを検証するために使用される仕様パターンを見てきました。そのパターンは、Carオブジェクトのセットにどのように適用されますか?

Specificationクラス(CheckUniqueCarSpecificationと呼びましょう)がICarRepositoryにアクセスすることは正当ですか?

4

2 に答える 2

2

リポジトリは、メモリ内コレクションを模倣します。私が以前に使用したのは、ContainsメソッドではなくFindメソッドですが、どちらも使用できると思います。これには、クエリ レイヤーを使用することもできます。を持っているのと同じように、 を持っているCarRepository可能性がありCarQueryます。ドメイン内の一意性をチェックしようとするのはやや面倒です。便宜上チェックを行いますが、そのケースも処理する必要があるため、DB に依存して例外を発生させます。これに仕様パターンを使用することは、価値がある以上の労力になる可能性があります。

Commitリポジトリは「コレクション」であるため、そこにはありませんRollback

于 2013-01-21T11:33:26.243 に答える
1

DomainService ICarCodesLibrary を使用します。

public class Car {
  ctor(string someUniqueCode, ICarCodesLibrary codes)
  {
    // the check
    codes.IsValidCode(someUniqueCode)
  }
  public int Id {get;private set;}
  public string SomeUniqueCode {get;private set;}
}

Car オブジェクトを作成して注入する場所にインターフェイスを実装します。また、プロパティを取り除き、フィールドを使用します。IDは小道具でもOKです。

于 2013-01-21T13:55:40.657 に答える