在DDD和域建模的上下文中,我们假设我有一个Product
类,它具有id
,price
属性,我在业务逻辑中广泛使用这些属性。但是,我的表示层还需要image
属性。我不认为我应该把它放在我的域层中(因为我的业务逻辑没有使用它),但是我想要考虑把它放在哪里。我应该创建一个ProductViewModel
并将其从某个地方的Product
类汇集吗?组装应该在应用层中完成吗?这里有什么选择?
答案 0 :(得分:1)
当您在表示层中的模型与基础域模型之间存在显着不匹配时,使用DTO之类的有用的一种情况。在这种情况下,使表示特定的外观/网关从域模型映射并呈现便于演示的界面是有意义的。它与Presentation Model非常吻合。我希望在新版本中更多地讨论这个问题。这是值得做的,但它只适用于有这种不匹配的屏幕(在这种情况下,它不是额外的工作,因为你无论如何都必须在屏幕上进行。)< / p>
所以似乎可以创建某种ProductViewModel
。
关于应该创建它的地方Martin Fowler说正确的方法是创建一种知道如何加载,保存和更新模型的ProductViewModelAssembler
。
在我的上一个项目中,我们设法不使用汇编程序,只是在DTO中创建了接受所有必要数据的构造函数。但是你仍然需要编写一些代码来保存和更新底层域模型。
答案 1 :(得分:0)
通常,我总是将查询与命令分开。
命令从使用者(例如客户端应用程序)发送到我的服务层。然后,服务层将请求路由到应用层,其中域和基础结构层用于执行请求。
查询也会发送到我的服务层,但是应用层会绕过域层并直接查询数据库;所以它没有使用域实体,但它有自己的查询实体(如果你愿意,可以使用表示实体);这与域实体不同。
如果我将您的情况投射到这个架构,那么应用层将负责构建包含图像的查询结果实体。由于域图层不用于查询,域实体不了解图像。
您没有提供有关您的体系结构外观的详细信息(您向表示层公开了哪些实体?域实体本身,或DTO&#39; s here),以及它似乎你没有这种分离,但无论如何都适用相同的概念:如果图像是一个表示问题,不要添加它做你的域实体。一个有效的选项可能是创建一个包含image属性的视图模型,你的控制器将负责正确构建它。