在多层架构中通过层传递业务实体

Posted

技术标签:

【中文标题】在多层架构中通过层传递业务实体【英文标题】:Passing business entities through layers in multi layer architecture 【发布时间】:2013-02-21 17:29:34 【问题描述】:

目前我正在开发一个利用多层架构的项目,如Application Architecture Guide 2.0 中所述,有 5 层(DAL、BLL、外观、表示层和公共层)。 这里我们有一个业务逻辑层,它由业务组件和业务实体(它们是使用 O/R 映射器生成的实体)组成,我们经常需要在表示层中使用这些实体来绑定和向用户呈现数据,所以我们将这些实体冒泡通过其他层直到表示层。

现在的问题是: 这是一个正确的方法吗? (根据我的定义,如果我们应该共享这些,我们应该将它们放在公共层中,以便我们可以在所有层中使用它们)。 我们不应该将这些实体移动到公共层吗?或者我们应该定义数据传输对象(DTO)之类的东西并通过层传递它们(这当然看起来是多余的)。

任何澄清将不胜感激。

【问题讨论】:

这是一个关于域实体及其放置位置可能有趣的系列:ludwigstuyck.wordpress.com/2013/03/05/… 【参考方案1】:

一个适当分层的应用程序通常会使用 DTO 来防止业务实体被掺假和扭曲以适应其他层的需求,以及其他原因。

但是,在非常小的应用程序中,您可以免除 DTO 映射的负担,并将业务实体一直传递到 UI。您可以将它们保留在 BLL 中,如果所有层都引用它,这并不引人注目。无论如何,它不再是一个真正的分层应用程序,因为您将架构压缩成一个大层。

Mark Seemann 在这个问题上有一个有趣的blog post。

【讨论】:

感谢链接,非常有趣。【参考方案2】:

仅将您的业务实体保留在业务层中。 DTO 最初可能看起来是多余的,但随着项目的发展,您会开始注意到它们之间的差异:DTO 更扁平,序列化友好类型和实体具有更复杂的关系和权力,它们比 DTO 承载更多的应用程序逻辑。

DTO 是纯数据,因此它们适合在层之间传递该数据。它们不必直接代表您的实体,因此,当您需要修改 BLL 但保留服务合同时,它们可以提高兼容性。

唯一的例外可能是 DAL 和 BLL 交互,其中 DAL 将直接处理实体。但即使在这里,也可以使用 DTO 来吸收 ORM 的影响。

【讨论】:

以上是关于在多层架构中通过层传递业务实体的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core搭建多层网站架构6.2-使用AutoMapper映射实体对象

三层架构

在 Symfony 中通过 ajax 为 ArrayCollection 数据传递 POST json 对象

如何落地业务建模 实践DDD时常见的问题

ASP .NET MVC 架构如何适应传统的多层架构

入门ABP——多层架构体系介绍