【发布时间】:2016-03-07 18:19:59
【问题描述】:
如果有以下代码。
public class CountryFactory : IEntityFactory
{
private readonly IRepository<Country> countryRepository;
public CountryFactory(IRepository<Country> countryRepository)
{
this.countryRepository = countryRepository;
}
public Country CreateCountry(string name)
{
if (countryRepository.FindAll().Any(c => c.Name == name))
{
throw new ArgumentException("There is already a country with that name!");
}
return new Country(name);
}
}
从 DDD 方法来看,是创建Country 的正确方法。或者最好有一个CountryService 来检查一个国家是否存在,如果不存在,只需调用工厂返回一个新实体。这意味着服务将负责持久化实体而不是工厂。
我对责任应该放在哪里有点困惑。特别是如果需要创建更复杂的实体,而不是创建一个国家那么简单。
【问题讨论】:
-
我认为问题可能来自您使用的词汇。该 create 方法实际上是一个具有默认值的查找,如果它不存在...它不是真正的 create...因此我发现很难认为它是无处不在的语言的一部分。如果不知道该实体是如何使用以及与之相关的,我发现很难说其他任何事情,因为有时逻辑可能位于域服务、应用程序服务、工厂、存储库或只是一个 新实例 视情况而定。
-
好吧,我真的需要知道将回购注入工厂是否有效/良好的做法。并且是否所有实体都有创建它们的工厂。它真的归结为,我是根据持久化的内容创建实体,还是创建实体,尝试持久化它并担心它是否会出错。
标签: domain-driven-design factory-pattern ddd-repositories