DAL 和 BLL 应通过的类型

Posted

技术标签:

【中文标题】DAL 和 BLL 应通过的类型【英文标题】:Types the DAL and BLL should pass 【发布时间】:2017-08-05 02:47:21 【问题描述】:

只是一个简单的问题。在具有业务逻辑层 (BLL) 和数据访问层 (DAL) 的分层架构环境中,DAL 应将哪些类型传递给 BLL?

目前我们的 DAL 类生成 DataTables 和 SQlDataReader 对象(以及其他常见数据类型)。对象到我们的自定义类型的转换应该在传递给 BLL 之前在 DAL 中完成,还是应该 DAL 传递原始类型并且 BLL 进行转换?

我正在尝试考虑一种方案,将来 DAL 层可能会被另一种技术取代。在那种情况下,听起来 BLL 应该期待转换后的数据类型,以便在进行切换时我们只需要确保我们的对象被返回?

对此的任何澄清或阅读材料以澄清事情都会有所帮助!

TIA

【问题讨论】:

这是一个见仁见智的问题,但我认为如果您有另一个程序集(*.Models 或仅包含您的模型定义的东西),那么您的 DAL 应该收集数据并将模型返回给 BLL。显然 DAL 和 BLL 都会引用 *.Models 程序集 【参考方案1】:

虽然有指导方针,但对此没有任何硬性规定。此外,每个项目的指南可能会根据架构、规模、要求、优先级、使用的 ORM 等而有所不同。请参阅 this。

正如我所说,没有什么是确定的,以下是我在我的大项目中所做的。

我正在使用 NHibernate ORM。我的 DAL 返回实体。我的 BLL 接收实体并将其转换为 DTO。然后将 DTO 传递给应用层。并非所有情况都如此。请参阅this 帖子。我已经在那个答案中提到了我为什么这样做的细节。

对于我的小型项目,我使用 Dapper ORM。在这种情况下,我的 DAL 返回实体。 BLL 接收实体并将其按原样传递给应用程序。由于 Dapper 不创建代理,我不将实体转换为 DTO。

看起来您没有使用任何 ORM。第二种方式(将实体转移到 BLL 并与应用程序相同)可能是您更好的方法。但你也应该考虑我上面提到的其他方面。

在上述任何情况下,DAL 都应该返回转换后的对象(如 Entity/POCO)而不是 ADO.NET 对象。这样,未来的任何技术切换都只需要在 DAL 中进行更改因为您的接口没有损坏。

传输 ADO.NET 对象(DataTable、DataReader)将您的 DAL 和整个项目绑定到一种技术。转换技术会很困难。另一方面,如果您的 DAL 返回实体(纯 c# 类),您可以在 DAL 中切换技术并且您的应用程序不受影响。在 BLL 中做什么取决于其他考虑因素。

在传递给 BLL 之前,应该在 DAL 中将对象转换为我们的自定义类型,还是应该由 DAL 传递原始类型并由 BLL 进行转换?

对象的转换应该发生在 DAL。转换后的对象应该传递给 BLL。

【讨论】:

以上是关于DAL 和 BLL 应通过的类型的主要内容,如果未能解决你的问题,请参考以下文章

简单反射使用

BLL,DAL,BO,插入数据

不同的 UI 共享相同的 BLL 和 DAL

bll,dal 和接口实现

BLL 和 DAL 之间的通信

DAL/BLL 和客户端/服务器:客户端应该使用 BLL 还是 DAL 对象进行演示?或者可能是另一层(数据传输对象?)