我来自交易脚本世界,现在开始研究DDD。我不确定将DDD设计与数据库持久性集成在一起的正确方法。这就是我所拥有的:
一个名为OrganisationService的服务类,其接口包含用于检索和保存Organization域对象实例的方法。组织是一个聚合根,并具有与之相关的其他数据:成员和许可证。在OrganisationService中使用EF6数据库优先DBContext来检索OrganisationDB实体以及相关的MemberDB和LicenseDB实体。当由OrganisationService检索并加载到Organization域对象中时,所有这些都转换为与其等效的域对象类。该对象看起来像这样:
public class Organisation
{
public IList<Member> Members { get; set; }
public IList<License> Licenses { get; set; }
}
我没有在OrganisationService中使用存储库模式...我将EF本身用作存储库,因为现在EF6似乎已使存储库成为多余。
在设计的这一点上,Organization域对象是贫乏的:它看起来像EF POCO Organization类。OrganisationService类看起来很像存储库!
现在,我需要开始添加逻辑。该逻辑包括管理组织的许可证和成员。现在,在交易脚本时代,我将向OrganisationService添加方法来处理这些操作,并调用存储库以与DB进行交互,但是对于DDD,我相信此逻辑应封装在Organization域对象本身内...
这是我不确定应该做什么的地方:作为逻辑的一部分,我需要将这些数据持久化回数据库。这是否意味着我应该在Organization域对象中使用DbContext来做到这一点?在域对象内使用存储库/ EF是否不好?如果是这样,那么这种持久性在哪里?
public class Organisation
{
public IList<Member> Members { get; set; }
public IList<License> Licenses { get; set; }
public void AddLicensesToOrganisation(IList<License> licensesToAdd)
{
// Do validation/other stuff/
// And now Save to the DB???
using(var context = new EFContext())
{
context.Licenses.Add(...
}
// Add to the Licenses collection in Memory
Licenses.AddRange(licensesToAdd);
}
}
我是否应该只对内存中的Organization域对象进行突变,然后将其推回到OrganisationService以获得持久性?然后,我必须跟踪对象上实际发生的变化(这是EF对自己的POCO所做的事情!我有点觉得EF不仅是存储库的替代品,而且还可能是域层!)
在这里的任何指导表示赞赏。