实体可以访问存储库吗?

问题描述 投票:25回答:5

我刚刚开始使用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

domain-driven-design repository-pattern ddd-repositories
5个回答
23
投票

这不是对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;
    }
}

5
投票

您问题的答案是标准答案:取决于


3
投票
我认为很容易说一个实体不应该知道存储库,但是很难将其付诸实践。尤其是当聚合中有大量vo的集合时,我们必须对其进行重构并将诸如

add


0
投票
真的是建议做ddd吗?

0
投票
首先,我认为实体本身以及如何组装实体实际上是两项职责。因此,理想情况下,最好将它们分配到不同的类中。但这也取决于。
© www.soinside.com 2019 - 2024. All rights reserved.