gpt4 book ai didi

domain-driven-design - 实体可以访问存储库吗?

转载 作者:行者123 更新时间:2023-12-03 10:27:21 24 4
gpt4 key购买 nike

我刚刚开始使用 DDD,所以也许这是一个愚蠢的问题......

实体可以访问存储库(通过某些 IRepository 接口(interface))以在运行时获取值吗?例如,我想对属性强制执行“默认”选择:

class Person {
private Company _employer;

public Company Employer {
get { return _employer; }
set {
if(value != null) {
_employer = value;
} else {
_employer = employerRepository.GetDefaultEmployer();
}
}
}

...
}

我的问题是,做这样的事情是否严重违反了 DDD 原则。如果不是,我的下一个问题是提供存储库以供使用的最佳方式是什么?是否应该在创建 Person 对象时提供?

谢谢,

最佳答案

这不是严重违反 DDD,而是严重违反……嗯……这简直太可怕了(我说这个舌头在脸颊上):)。

首先,您的实体变得依赖于拥有一个存储库......这并不理想。
理想情况下,您希望您的存储库创建 Person,然后为其分配在当前域上下文中有效所需的所有内容。

所以当你需要一个人时,你会去 personRepository.GetPersonWithDefaultEmployer() 并取回一个填充了默认雇主的人。 personRepository 将依赖于一个employerRepository,并在返回它之前使用它来填充这个人。

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;
}
}

关于domain-driven-design - 实体可以访问存储库吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/827670/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com