我只是想摆脱存储库/服务/演示的典型 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?
}
}
我的问题如下,我很感激任何澄清,因为我确定我误解了这里的基本原则:
- 只有聚合对象应该暴露给表示层(或任何消费层)。
- 如何处理将聚合对象转换/持久化到数据库,我可以使用映射,这很好,但是我怎么知道我是在创建对象还是在更新(如果设置了 Id,它是否是瞬态的?) . 我如何知道是否已添加新图像以及更新或删除哪些图像?我认为我遇到的问题是我调用 create 将新闻聚合传递给存储库并创建它,然后我可以从通过 EF 实体填充的域中获取聚合,然后添加图像,当我传递新闻聚合时返回 我如何知道为了创建/更新数据而发生了什么变化?
- 客户应该去哪里,是否应该作为 AddCustomer 方法在新闻聚合对象上,是否应该有一个具有 AddNews 方法的 CustomerAggregate 以及这两个选项如何持续存在?
非常感谢您的任何见解,我一直在阅读并查看示例项目,这些项目展示了这个概念,但似乎并没有完全解释实现这一目标的最佳方法。