目前,我正在开发一个利用多层架构的项目,如Application Architecture Guide 2.0中所描述的5层(DAL,BLL,Facade,表示层和公共层)。 在这里,我们有一个业务逻辑层,它由业务组件和业务实体(使用O / R映射器生成的实体)组成,我们经常需要在表示层中使用这些实体来绑定和向用户呈现数据,因此我们将这些实体冒泡通过其他图层到表示层。
现在的问题是:
这是一种正确的方法吗? (据我所知,如果我们应该分享这些,我们应该将它们放在公共层中,这样我们就可以在所有层中使用它们)。
我们不应该将这些实体移动到公共层吗?或者我们应该定义像数据传输对象(DTO)这样的东西并将它们传递给层(当然这似乎是多余的)。
任何澄清都将不胜感激。
答案 0 :(得分:3)
正确分层的应用程序通常会使用DTO来防止商业实体被掺假和扭曲以满足其他层的需求,以及其他原因。
但是,在非常小的应用程序中,您可以免除DTO映射的负担,并让业务实体一直传递到UI。您可以将它们保留在BLL中,如果所有图层都引用它,则不是戏剧性的。它无论如何都不是一个真正的分层应用程序,因为你将架构分成一个大层。
Mark Seemann对这个问题有一个有趣的blog post。
答案 1 :(得分:1)
仅将您的业务实体保留在业务层中。 DTO最初可能看起来多余,但随着项目的增长,你会开始注意到它们之间的差异:DTO更平坦,序列化友好类型和实体具有更复杂的关系和功能,它们比DTO具有更多的应用程序逻辑。
DTO是普通数据,因此它们适合在各层之间传递数据。它们不必是您实体的直接表示,因此当您需要修改BLL但保留服务合同时,它们可以提高兼容性。
唯一的例外可能是DAL和BLL交互,其中DAL将直接处理实体。但即使在这里,DTO也可以用来吸收ORM的影响。