我们正在尝试找出使用DDD时的最佳实践,我们正在讨论什么是最有意义的或“正确的方法”。
注意:所有代码都是伪代码。
让步如下:
public interface IDomainEntityAService
{
void CreateMyObject(DomainEntityA myobject);
DomainEntityA RetrieveDomainEntityA(long someId);
//Other operations that handle the business logic dealing with MyObject
}
我们还有另一个服务,它使用IDomainEntityA服务的一部分来促进专门的需求。
public interface IDomainEntityBService
{
DomainEntityB GetDomainEntityB();
}
如果其他信息包含以下内容:
public class DomainEntityB
{
public string Name { get; set; }
public IList<DomainEntityA> DomainEntityAList { get; set; }
}
现在我们的问题来了。我们正在研究使用存储库来保存其他信息,如:
public interface IDomainEntityBRepository
{
void Add(DomainEntityB information);
DomainEntityB Get(long someId);
}
因为我们希望尽可能保持干燥,所以理想情况下我们希望重用IDomainEntityAsService的逻辑来检索DomainEntityB的DomainEntityList列表。哪一个最有意义?
a)在IDomainEntityBrepositive中引用IDomainEntityA服务
例如
public class SqlDomainEntityBRepository : IDomainEntityBRepository
{
public SqlDomainEntityBRepository(IDomainEntityAService domainEntityAService, Database database)
{
}
public void Add(DomainEntityB information)
{
//save DomainEntityB to SQL
}
public DomainEntityB Get(long someId)
{
//Get OtherInformation.Name from SQL
//use domainEntityAService.Get() to populate the list of DomainEntityAList
//return DomainEntityB
}
}
b)IDomainEntityBRepository只处理SQL内容,我们使用用于保存其他信息的服务层来填充MyObjects列表。
public class DomainEntityBService : IDomainEntityBService
{
public DomainEntityBService(IDomainEntityAService domainEntityAService, IDomainEntityBRepository repo)
{
}
public DomainEntityB GetDomainEntityB()
{
var domainEntityB = _repo.Get(someId);
domainEntityB.DomainEntityAList = _domainEntityAService.GetAll(someId);
return domainEntityB;
}
}
c)我们为其他信息创建一个特定的DAL对象,并使用服务层来组成其他信息的实例。
public class DomainEntityBDAL
{
public string Name { get; set; }
public IList<int> DomainEntityAListIds { get; set; }
}
然后我们将有一个存储库来检索其他信息,然后代码将如下所示:
public class DomainEntityBService : IDomainEntityBService
{
public DomainEntityBService(IDomainEntityAService domainEntityAService, IDomainEntityBRepository repo)
{
}
public DomainEntityB GetDomainEntityB()
{
var domainEntityBDAL = _repo.Get(someId);
DomainEntityB result = new DomainEntityB() { Name = domainEntityBDAL.Name };
foreach (var id in domainEntityBDAL.DomainEntityAListIds)
{
result.DomainEntityAList.Add(_domainEntityAService.Get(id));
}
return result;
}
}
d)哇,我们完全是基地外的人,做这个吧!!!!
我希望这是有道理的,谢谢你的帮助。
编辑注释:
也许英文描述可以更好地描述我的问题。我们有一个聚合根的DomainEntityA。有一个对应的服务来处理所有处理DomainEntityA的逻辑。
现在我们还有一个域名entityb,它是一个聚合根。但是,DomainEntityB有一个DomainEntityA列表。DomainEntityA可以独立生活,但是没有DomainEntityA的列表,DomainEntityB不能生活。
我们如何加载DomainEntityB中的DomainEntityA项列表并维护DomainEntityA的所有逻辑。
在域实体服务中重用域实体服务?
在域实体服务中创建单独的域实体实体实体?
我们目前使用entlib,但更多的是关于设计的信息,而不是DAL实现。