【问题标题】:Domain Driven Development: Detecting changes (.NET)领域驱动开发:检测更改 (.NET)
【发布时间】:2023-03-12 04:44:01
【问题描述】:

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

我从纯域模型开始,现在坚持使用我的数据访问层。我有一个完全自制的数据访问层,因此没有任何众所周知的 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 的 Documents 集合时。基本上我在这里看到两种可能的情况:

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

2) 在存储库中实现单独的方法以将文档添加到包中。

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

【问题讨论】:

  • 小子哦小子,恐怕你还有很多工作要做。在模型中散布实体和存储库不会使其成为 DDD。不是跟踪文档,而是跟踪文档标识符。此外,由于您使用的是自定义持久性,因此请尝试更多地封装状态。首先考虑一个对象的行为,我保证,状态会自然而然地遵循。
  • 引用 Jeff Atwood 的话:“不要重新发明轮子,除非你打算学习更多关于轮子的知识”。那么,你在学习 ORM 吗?如果没有,你为什么要重新发明 ORM?

标签: domain-driven-design data-access-layer


【解决方案1】:

通常,更改跟踪将由 ORM(例如 NHibernate)处理。在您的情况下,您可以执行以下操作:

  • 根据身份属性的值选择新文档。
  • 在重新插入表之前发出 SQL 删除语句。

这两种方法的一个问题是文档集合可能很大,因此为每个PostalDocumentsPackage 加载所有文档可能是一个瓶颈。此外,除了文档集合之外,您还必须考虑是否需要对 Document 实体进行更改跟踪。如果是这样,那么您还需要为 Document 类实现更改跟踪。鉴于您没有使用 ORM,我建议您使用解决方案 #2,因为解决方案 #1 将引导您重新实现更改跟踪,这会污染您的域类。您也可以考虑使用CQRS/Event Sourcing 架构,其中明确更改跟踪。

【讨论】:

    猜你喜欢
    • 2016-03-24
    • 2011-03-04
    • 1970-01-01
    • 2010-09-23
    • 2014-07-24
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 2011-10-06
    相关资源
    最近更新 更多