我正在使用域驱动设计开发应用程序。我一直使用的模式之一是存储库模式。为简单起见,假设我有以下类和接口。
汽车 - 代表汽车领域概念的领域类。
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是否合法?
答案 0 :(得分:1)
存储库模仿内存中的集合。我之前使用的是Contains
方法,而不是Find
方法,我想你可能有。查询图层也可用于此目的。正如您拥有CarRepository
一样,您可以拥有CarQuery
。试图检查域中的唯一性有点令人讨厌。为方便起见,我会做一个检查,但仍然依赖于DB来引发异常,因为你也应该处理这种情况。使用规范模式可能比它的价值更多。
由于存储库是一个“集合”,我不会在那里Commit
和Rollback
。
答案 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可以成为道具。