【发布时间】:2010-02-22 18:31:11
【问题描述】:
我们正在尝试找出使用 DDD 时的最佳做法,并且我们正在讨论什么是最有意义的或“正确的方式”。
注意:所有代码均为伪代码。
承认以下几点:
public interface IDomainEntityAService
{
void CreateMyObject(DomainEntityA myobject);
DomainEntityA RetrieveDomainEntityA(long someId);
//Other operations that handle the business logic dealing with MyObject
}
我们还有另一个服务,它使用 IDomainEntityAService 的一部分来满足特殊需求。
public interface IDomainEntityBService
{
DomainEntityB GetDomainEntityB();
}
其中 OtherInformation 包含以下内容:
public class DomainEntityB
{
public string Name { get; set; }
public IList<DomainEntityA> DomainEntityAList { get; set; }
}
现在我们的问题来了。我们正在研究使用存储库来保存 OtherInformation,如下所示:
public interface IDomainEntityBRepository
{
void Add(DomainEntityB information);
DomainEntityB Get(long someId);
}
由于我们希望尽可能保持 DRY,因此理想情况下,我们希望重用 IDomainEntityAService 的逻辑来检索 DomainEntityB 的 DomainEntityAList 列表。哪一个最有意义?
A) 在 IDomainEntityBRepository 中有对 IDomainEntityAService 的引用 例如
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 内容,我们使用 IHaveOtherInformation 的服务层来填充 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) 我们为 OtherInformation 创建一个特定的 DAL 对象,并使用服务层来组成 OtherInformation 的一个实例
public class DomainEntityBDAL
{
public string Name { get; set; }
public IList<int> DomainEntityAListIds { get; set; }
}
然后我们将有一个存储库来检索 OtherInformationDAL,然后代码将如下所示:
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 的所有逻辑。
现在我们还有 DomainEntityB,它是一个聚合根。但是 DomainEntityB 有一个 DomainEntityAs 的列表。 DomainEntityAs 可以独立存在,但是 DomainEntityB 不能没有 DomainEntityAs 的列表
我们将如何加载 DomainEntityB 中的 DomainEntityA 项目列表并维护 DomainEntityA 的所有逻辑。
在 DomainEntityBService 中重用 DomainEntityAService?
在 DomainEntityBService 中创建一个单独的 DomainEntityARepository?
我们目前使用 EntLib,但正在寻找更多关于设计的信息,然后是 DAL 实现。
【问题讨论】:
-
不应该直接回答你使用哪个 DAL 实现吗?你为什么对 Entlib 如此执着?
-
如果某个 DAL 实现更容易实现这一点,我完全赞成。我们过去使用 Entlib,并计划将其与 Repository 模式一起使用。
标签: c# domain-driven-design service repository-pattern