Domain driven design 域驱动开发:检测更改(.NET)

Domain driven design 域驱动开发:检测更改(.NET),domain-driven-design,data-access-layer,Domain Driven Design,Data Access Layer,我刚刚开始领域驱动设计,并试图将其应用于我当前的项目 我从一个纯域模型开始,现在坚持使用我的数据访问层。我有一个完全自制的数据访问层,因此这里没有任何著名的ORM工具可以应用 我不知道如何处理更新。假设我有以下对象: public class Document : Entity { public IPropertiesCollection Properties { get; set; } public IContents Contents { get; set; } } pu

我刚刚开始领域驱动设计,并试图将其应用于我当前的项目

我从一个纯域模型开始,现在坚持使用我的数据访问层。我有一个完全自制的数据访问层,因此这里没有任何著名的ORM工具可以应用

我不知道如何处理更新。假设我有以下对象:

public class Document : Entity
{
    public IPropertiesCollection Properties { get; set; }

    public IContents Contents { get; set; }
}

public class PostalDocumentsPackage : Entity
{
    public String Name { get; set; }

    public DateTime DeliverDate { get; set; }

    public ICollection<Document> Documents { get; set; } 
}
我有相应的存储库IDocumentsRepository和IPostalDocumentPackagesRepository,用于目前检索对象

我现在要处理的问题是,当我想添加一个新文档时,如何处理PostalDocumentsPackage的文档集合。基本上,我在这里看到两种可能的情况:

1实现集合,该集合跟踪原始集合中的更改,并保存更新\删除的项目列表

2在存储库中实现向包中添加文档的单独方法


我想知道这些方法是否可行,或者将来会导致问题?或者还有其他选择?

通常,变更跟踪将由诸如NHibernate之类的ORM处理。在您的情况下,您可以执行以下操作:

根据identity属性的值选择新文档。 在重新插入表之前发出SQL delete语句。
这两种方法的一个问题是文档集合可能很大,因此为每个PostalDocumentsPackage加载所有文档可能是一个瓶颈。此外,除了文档集合之外,还必须考虑是否需要对文档实体进行更改跟踪。如果是这样,那么您还需要为文档类实现更改跟踪。考虑到您没有使用ORM,我建议使用解决方案2,因为解决方案1将引导您重新实现更改跟踪,这将污染您的域类。你也可以考虑一种架构,其中改变跟踪是明确的。

男孩,哦,孩子,恐怕你有很多工作要做。在模型中喷洒实体和存储库不会使其成为DDD。跟踪文档标识符,而不是跟踪文档。此外,由于您使用的是自定义持久性,请尝试进一步封装状态。首先考虑一个物体的行为,我保证,状态会自然地跟随。引用杰夫·阿特伍德的话:不要重新发明轮子,除非你计划学习更多关于轮子的知识。那么,你在学习ORMs吗?如果不是,为什么要重新发明ORM?