域驱动设计 - 如何检查域对象中一个属性的唯一性

时间:2013-01-21 10:01:55

标签: domain-driven-design repository-pattern unique-constraint specification-pattern

我正在使用域驱动设计开发应用程序。我一直使用的模式之一是存储库模式。为简单起见,假设我有以下类和接口。

汽车 - 代表汽车领域概念的领域类。

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属性的唯一性?在对象生命周期中的任何时候,用户(不是自动生成)都会更改该属性。当然,一种解决方案是将唯一密钥放在数据库中,但这不是DDD的原则。我见过用于验证单个对象的规范模式。该模式将如何应用于一组Car对象?

规范类(让我们称之为CheckUniqueCarSpecification)访问ICarRepository是否合法?

2 个答案:

答案 0 :(得分:1)

存储库模仿内存中的集合。我之前使用的是Contains方法,而不是Find方法,我想你可能有。查询图层也可用于此目的。正如您拥有CarRepository一样,您可以拥有CarQuery。试图检查域中的唯一性有点令人讨厌。为方便起见,我会做一个检查,但仍然依赖于DB来引发异常,因为你也应该处理这种情况。使用规范模式可能比它的价值更多。

由于存储库是一个“集合”,我不会在那里CommitRollback

答案 1 :(得分:0)

使用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可以成为道具。