我正在(重新)设计大型应用程序,我们使用基于DDD的多层架构。
我们有带有数据层(存储库的实现)、领域层(域模型和接口的定义——存储库、服务、工作单元)、服务层(服务的实现)的MVC。到目前为止,我们在所有层上使用域模型(主要是实体),并且仅将dto用作视图模型(在控制器中,服务返回域模型,控制器创建视图模型,并将其传递给视图)。
我读过无数关于使用、不使用、映射和传递dto的文章。我知道没有任何明确的答案,但我不确定是否可以将域模型从服务返回到控制器。如果我返回域模型,它仍然没有传递到视图,因为控制器总是创建特定于视图的视图模型-在这种情况下,它似乎是合法的。另一方面,当域模型离开业务层(服务层)时,感觉就不对了。有时服务需要返回域中未定义的数据对象,然后我们必须向未映射的域添加新对象,或者创建POCO对象(这很难看,因为有些服务返回域模型,有些则有效地返回dto)。
问题是——如果我们严格使用视图模型,是否可以将域模型一直返回到控制器,或者我们应该始终使用dto与服务层通信?如果是,是否可以根据服务需求调整域模型?(坦白地说,我不这么认为,因为服务应该消费域拥有的东西。)如果我们应该严格遵循dto,那么它们应该在服务层定义吗?(我想是的。)有时很明显我们应该使用DTO(例如,当服务执行大量业务逻辑并创建新对象时),有时很明显我们应该只使用域模型(例如,当会员服务返回贫血的用户时——创建与域模型相同的DTO似乎没有多大意义)——但我更喜欢一致性和良好实践。
文章域vs DTO vs ViewModel -如何以及何时使用它们?(以及其他一些文章)与我的问题非常相似,但它没有回答这个问题。文章我应该用EF在存储库模式中实现dto吗?也类似,但它不处理DDD。
免责声明:我不打算使用任何设计模式只是因为它的存在和花哨,另一方面,我想使用好的设计模式和实践,也是因为它有助于设计应用程序作为一个整体,有助于分离关注点,即使使用特定的模式不是“必要的”,至少在目前。