【发布时间】:2011-05-19 14:22:07
【问题描述】:
我非常感谢人们对以下设计问题的意见。
我有一个模型,其中“个人”或“企业”可能是某个“服务”的提供者。示例类定义如下所示:
IProvider
Guid Id
人员:IProvider
Guid Id
string FirstName
string LastName
业务:IProvider
Guid Id
字符串名称
服务
Guid Id
IProvider 提供者
因此,我在我的领域中创建了相关概念,“Person”、“Business”、“IProvider”和“Service”。我正在努力的地方是创建存储库的实体。在这种情况下,“服务”是一个聚合根,因此有自己的存储库。在我的上下文中,“业务”也是一个聚合根,因为即使它不是提供者,它也会有意义。 “Person”只有在“是 Provider”时才会在系统中创建。
我会为 IProvider 的角色创建一个存储库,它会返回“Person”和“Business”的实例吗?我的问题是代码可能很快变得非常复杂,因为任何实现都需要查看多个表等以返回所有不同类型的 IProvider。这种方法需要为“Person”和“Business”创建存储库并将其注入“IProvider”存储库以提供所需的功能,即
public class ProviderRepository : IProviderRepoistory
{
public IBusinessRepository businessRepository {get; set; }
public IPersonRepository personRepository {get; set; }
public IProvider FindById(Guid Id){
IProvider entity = businessRepository.FindById(Id);
if(entity == null)
entity = personRepository.FindById(Id);
return entity;
}
}
另一种方法是为实现“IProvider”接口的“Person”和“Business”实体创建存储库,从而使它们可以参与该角色。即
public class PersonRepository : IPersonRepository, IProviderRepository
{
private ISession session;
public Person FindById(Guid Id){
return session.Query<Person>().FirstOrDefault<Person>(x => x.Id == Id);
}
public IProvider FindById(Guid Id){
return session.Query<Person>().FirstOrDefault<Person>(x => x.Id == Id && x.IsProvider == true);
}
}
然后,我会在需要时使用机制(即 IoC 容器)来选择 IProviderRepository 的正确具体实现。例如,如果我正在与我知道是个人的提供者打交道,我可以获得 PersonRepository 实现。
另一种选择是不实施任何 IProvider 存储库,只使用“Person”和“Business”存储库并在服务层中根据需要使用它们?
【问题讨论】:
标签: nhibernate domain-driven-design roles ddd-repositories