mapper层可以使用业务层吗?

Posted

技术标签:

【中文标题】mapper层可以使用业务层吗?【英文标题】:Can mapper layer use business layer? 【发布时间】:2012-06-12 11:37:54 【问题描述】:

在我的 n 层架构中,我有一个映射器层来填充来自 DBlayer 的数据集/数据表的响应上下文。所以 DBlayer 调用 Mapperlayer 来完成这些事情。但在填充响应上下文之前,我需要做一些验证。为此,我应该从 mapperlayer 调用 businesslayer 吗?或者我应该将我从 DBlayer 获得的内容传递给 businesslayer,并要求 businesslayer 调用 mapperlayer。

在这里,我的业务层将使用业务实体进行自己的操作。请帮助我做出这个设计决定。

【问题讨论】:

转到您提出的其他问题,选择一个为您的问题提供解决方案的答案,然后单击该答案旁边的大复选标记。 层和层不是一回事。 【参考方案1】:

任何一个都可以“工作”,但我不喜欢将这些东西放在业务对象中。

让业务层调用映射器层会在包之间创建循环依赖关系。映射层已经必须了解业务层——这是其职责的核心。

但是为什么业务层应该知道映射器呢?映射与业务逻辑无关。当然,坏处是,如果存在双向依赖,您永远无法独立测试它们。

我会将其保留为单向依赖项。您可以通过这种方式独立于映射对象来测试业务对象。

我还将映射器保留在持久层中,而不是位于持久层和模型之间。让您的持久层返回业务对象,而不是结果集。如果可能的话,让它成为私有包。我的推理是一样的——最少的知识意味着最小的耦合。

有不同级别的验证。我会说数据应该在进入您的数据库之前很久就已经过验证。查询数据库时应该不需要验证,除了特定的业务规则。这些规则应该是服务层中业务事务的一部分,而不是持久层。

【讨论】:

好吧,你是说从 DBlayer 调用 mapperobjects 更好?此外,我通过所有 BL、FacadeLayer 和 DataAccess 层传递 rqstcontext(AddressSearchRequestContext)。这不是紧耦合吗? 我相信确实如此。我看不出为什么这样的事情需要逃出持久层。 如果没有单向依赖,它们就不会是层。

以上是关于mapper层可以使用业务层吗?的主要内容,如果未能解决你的问题,请参考以下文章

mapper层是干啥的

ASP WebApi:服务层、业务层和数据访问层

java开发时为啥要dao和service都是model层吗?

spring-ioc的学习

SSM开发

服务层模式 - 我们可以在特定情况下避免服务层吗?