我正在(重新)设计大型应用程序,我们使用基于DDD的多层体系结构。
我们的MVC具有数据层(存储库的实现),域层(域模型和接口的定义-存储库,服务,工作单元),服务层(服务的实现)。到目前为止,我们在所有层上都使用域模型(主要是实体),并且仅将DTO用作视图模型(在控制器中,服务返回域模型,并且控制器创建视图模型,该模型传递给视图)。
我读了无数关于使用,不使用,映射和传递DTO的文章。我知道没有明确的答案,但是我不确定是否可以将域模型从服务返回到控制器。如果我返回域模型,它仍然永远不会传递给视图,因为控制器始终会创建特定于视图的视图模型-在这种情况下,它似乎合法。另一方面,当域模型离开业务层(服务层)时,感觉不对。有时服务需要返回域中未定义的数据对象,然后我们必须向未映射的域中添加新对象,或者创建POCO对象(这很丑陋,因为某些服务返回域模型,因此某些服务有效地返回DTO)。
问题是-如果我们严格使用视图模型,是否可以将域模型一直返回给控制器,还是应该始终使用DTO与服务层进行通信?如果是这样,可以根据需要的服务来调整域模型吗?(坦率地说,我不这么认为,因为服务应该使用哪个域。)如果我们严格遵守DTO,是否应该在服务层中定义它们?(我是这样认为的。)有时候,很明显我们应该使用DTO(例如,当服务执行大量业务逻辑并创建新对象时),有时很显然,我们应该仅使用域模型(例如,当Membership服务返回贫乏的User( s)-创建与域模型相同的DTO似乎没有多大意义)-但我更喜欢一致性和良好做法。
Article Domain与DTO与ViewModel-如何以及何时使用它们?(以及其他一些文章)与我的问题非常相似,但是并不能回答这个问题。第二条我应该实现与EF存储库模式的DTO?也很相似,但不涉及DDD。
免责声明:我不打算仅仅因为它存在并且很花哨就使用任何设计模式,另一方面,我也想使用好的设计模式和实践,因为它有助于整体上设计应用程序,有助于分离的担忧,至少在目前,甚至不需要使用特定的模式。
与往常一样,谢谢。