asp.net-mvc - DDD原理与ASP.NET MVC项目设计

标签 asp.net-mvc design-patterns domain-driven-design

两部分问题

我有一个产品聚合;

价格
包装选项
产品说明
产品图片
等等

我对一个产品存储库进行了建模,并且没有为任何子类创建单独的存储库。所有数据库操作都通过产品存储库处理。

到目前为止,我是否正确理解了 DDD 概念?有时我想到的问题是,通过使用其 ID 直接从数据库中获取打包选项,而不是要求产品存储库在它的 PackagingOptions 集合中找到它并给出它给我..

第二部分是使用 ASP.MVC 框架管理编辑创建操作

我目前正在尝试通过产品 Controller 管理这些产品子集合的所有添加编辑删除(听起来对吗?)。

我现在面临的一个挑战是;

如果我通过编辑产品的特定包装选项

mydomain/产品/editpackagingoption/10

我可以访问包装选项的 ID

但是我没有产品本身的 ID,这迫使我编写查询以首先找到具有此特定包装选项的产品,然后编辑该产品和相关的包装选项。我可以这样做,因为所有包装选项都有其唯一 ID,但如果我的集合没有唯一 ID,这将失败。

感觉很不对劲。。

我想到的下一个选项是在 url 上同时发送产品和包装选项 ID,例如;

mydomain/产品/editpackagingoption/3/10

但我不确定这是否是一个好的设计。

所以我现在有点困惑。可能对所有这些都有根本的误解......

如果您能忍受这个冗长的问题并帮助我把它放在一起,我将不胜感激。谢谢!

最佳答案

在我看来,这是 DDD 中出现的那些泥泞的事情之一。

在代码中,我将聚合根视为它所具有的任何“关系”以及任何没有聚合根就无法存在的实体对象的容器。

例如,让我们以现在已经被打死的 Customer->Order->LineItem->Product 示例为例。在这种情况下,我显示的聚合根是客户。也就是说,您并不总是希望通过客户获得订单。您可能想要查找特定日期的订单。

把它放在一边,你也不会有一个没有订单的客户。两者处于某种共生关系,因此一个不是另一个的总根。

关键是您不想通过订单加载客户,但您也不一定希望通过客户加载订单。

但是,从 Order 开始,您不太可能只想检索 LineItem,而且您肯定不会在没有订单的情况下创建它们。为此,订单充当 LineItems 的网关。 LineItems 不需要自己的 Controller 或存储库。它们仅存在于订单本身内,因此是订单的一部分(在这种情况下,订单成为聚合根)并由订单实体管理。

但是,LineItem 可能与系统内的 Product 有关系。产品将有自己的 Controller 、存储库等,因为它们可以存在于聚合根之外。

总结一下我的散漫,我倾向于这样看:如果一个实体可以单独存在,它应该有一个 Controller 。不能单独存在的实体(在本例中为 LineItems)只能由它们的容器(聚合根)单独管理。

如果/哪里我错了,请一些 DDD 纯粹主义者纠正我吗?

至于你问题的第二部分,我需要更多关于你如何设想这些其他实体工作的细节。根据您在此处放置的内容,我认为 PackagingOptions 与产品相关,并且将成为 Product 聚合根的一部分。现在,暗示您正在编辑它们会引出一个问题:这是系统中的查找表还是一次性值,因此,应该将其视为值对象?

关于asp.net-mvc - DDD原理与ASP.NET MVC项目设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1338139/

相关文章:

c# - MVC Razor AJAX 调用未命中 Controller

asp.net-mvc - 从命令运行查询是否违反了命令-查询分隔?

java - 带有身份的 Spring Data 和 JPA + Hibernate 问题的 DDD 实现

javascript - ASP.NET MVC : Trying to store image url in js variable using razor syntax

c# - 将外部程序集添加到 ASP.NET MVC 项目的常用方法是什么?

html - 按钮始终右对齐

c# - 在哪里放置验证逻辑?在服务或存储库中?

design-patterns - 在 F# 中 float 的整数列表

domain-driven-design - 具有大数据集权限读取时的 CQRS

domain-driven-design - 存储库模式 : how to Lazy Load? 或者,我应该拆分此聚合吗?