gpt4 book ai didi

c# - 如何在 DDD 中对聚合建模并持久化到数据库

转载 作者:行者123 更新时间:2023-11-30 20:58:58 25 4
gpt4 key购买 nike

我只是想走出我对典型的存储库/服务/展示的 N 层架构的舒适区,并开始研究 DDD 和聚合,我不得不承认我有点困惑,希望有人能澄清以下示例:

如果我有一个名为 News、NewsImage 和 Customer 的实体,它们都是像这样的 EF 持久化对象:

public class Customer
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
}

public class NewsImage
{
public virtual int Id { get; set; }
public virtual byte[] Data { get; set; }
public virtual News News { get; set; }
}

public class News
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual ICollection<NewsImage> NewsImages { get; set; }
public virtual Customer Customer { get; set; }
}

据我所知,这些可能是我们用来将域对象持久保存到数据库的对象,但如果我们使用域模型中的聚合,我们可能会有这样的东西:

public class NewsAggregate
{
public int Id { get; set; }
public string Name { get; set }

public void AddImageToNews(byte[] imageData)
{
// Hide NewsImage or that object and add the byte[] data here?
}
}

我的问题如下,我很感激任何澄清,因为我确信我误解了这里的基本原则:

  1. 只有聚合对象应该暴露给表示层(或任何消费层)。
  2. 我如何处理将聚合对象转换/保存到数据库,我可以使用很好的映射,但是我怎么知道我是在创建对象还是在更新(通过设置 Id 时它是否是 transient 的,或者不是?)。我如何知道是否添加了新图像以及要更新或删除哪些图像?我认为我遇到的问题是我调用 create 将新闻聚合传递给存储库并创建它,然后我可以从通过带有 EF 的实体填充的域中获取聚合,然后添加图像,当我传递新闻聚合时返回 我怎么知道为了创建/更新数据而发生了什么变化?
    1. 客户应该去哪里,是否应该作为 AddCustomer 方法出现在新闻聚合对象上,是否应该有一个具有 AddNews 方法的 CustomerAggregate 以及如何在这两种情况下保持?

非常感谢您提供任何见解,我一直在阅读和查看示例项目,这些项目展示了这个概念,但似乎没有完全解释实现这一目标的最佳方法。

最佳答案

首先:DDD 不建议您使用任何特定的体系结构。我在 DDD 中使用了许多不同的架构,您应该使用对任务有利的架构。显然,如果您以数据驱动的方式思考,您会遇到 DDD 的许多问题。

DDD 是一种旨在应对复杂业务规则的方法。如果您的应用程序值(value)在于技术 Assets (例如在云中、公开 Web 服务或一些不错的 html5/移动 UI),但在于它处理的业务的复杂性,则不应使用它。
您不应该将 DDD 用于简单的业务规则。经验法则是:如果您不需要领域专家来了解业务,那么您根本不需要 DDD。

然后,要正确理解聚合,您应该阅读 Vernon 的 essay on the topic .那篇文章解释说,聚合的存在是为了确保业务不变量。您不应该只是使用聚合来优化数据库访问。

关于c# - 如何在 DDD 中对聚合建模并持久化到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15728648/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com