DAL 和 BLL 应该通过的类型

Types the DAL and BLL should pass

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

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

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

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

TIA

虽然有指导方针,但没有任何硬性规定。此外,指南可能会根据体系结构、大小、要求、优先级、使用的 ORM 等因项目而异。请参阅 this

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

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

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

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

对于上面提到的任何情况,DAL 应该 return 转换对象(如 Entity/POCO)而不是 ADO.NET 对象。 这样,只要您的接口没有损坏,未来的任何技术转换都只需要在 DAL 中进行更改。

传输 ADO.NET 对象(DataTable、DataReader)将您的 DAL 和整个项目绑定到一种技术。切换技术将很困难。另一方面,如果您的 DAL returns 实体(纯 c# class),您可以在 DAL 中切换技术并且您的应用程序不受影响。 BLL 中的操作由您根据其他考虑因素决定。

Should the conversion of the objects to our custom types be done in the DAL before passing to the BLL or should the DAL pass the original type and the BLL does the conversion?

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