我刚刚开始使用DDD,所以也许这是一个愚蠢的问题...
实体是否可以通过运行库(通过某些IRepository接口)访问存储库以在运行时获取值?例如,我要对属性强制执行“默认”选择:
class Person {
private Company _employer;
public Company Employer {
get { return _employer; }
set {
if(value != null) {
_employer = value;
} else {
_employer = employerRepository.GetDefaultEmployer();
}
}
}
...
}
我的问题是,这样做是对DDD原则的可怕违反。如果不是,那么我的下一个问题将是提供要使用的存储库的最佳方法是什么?创建Person对象时是否应该提供它?
谢谢,P
这不是对DDD的可怕违反,而是对...的可怕违反。。。。。。。。。。。。。。。。。。。。。。。。。。
首先,您的实体变得依赖于拥有存储库...这是不理想的。理想情况下,您希望您的存储库创建Person,然后为其分配在当前域上下文中有效所需的一切。
因此,当您需要一个Person时,您将进入personRepository.GetPersonWithDefaultEmployer()并取回已填充默认雇主的人员。 personRepository将依赖loyerRepository,并在返回之前使用它来填充此人。
PersonReposotory : IPersonRepository
{
private readonly IEmployerRepository employerRepository;
//use constructor injection to populate the EmployerRepository
public PersonRepository(IEmployerRepository employerRepository)
{
this.employerRepository = employerRepository;
}
public person GetPersonWithDefaultEmployer(int personId)
{
Person person = GetPerson(personId);
person.Employer = employerRepository.GetDefaultEmployer(personId);
return person;
}
}
您问题的答案是标准答案:取决于
add