DAL和BLL应该通过的类型

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

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

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

任何明确的这个或阅读材料清理的东西都会有所帮助!

TIA

虽然有指导方针,但对此没有任何硬性规定。 此外,指南可能会根据体系结构,大小,要求,优先级,使用的ORM等每个项目进行更改。请参阅此处。

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

我正在使用NHibernate ORM。 我的DAL返回实体。 我的BLL接收实体并将其转换为DTO。 然后将DTO传递给应用程序层。 对于所有情况也是如此。 请参阅这篇文章。 我已经提到了为什么我这样做的答案。

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

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

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

传输ADO.NET对象(DataTable,DataReader)将您的DAL和整个项目绑定到一种技术。 切换技术很难。 另一方面,如果您的DAL返回Entity(普通c#类),您可以在DAL中切换技术,并且您的应用程序不受影响。 基于其他考虑,BLL中的操作取决于您。

是否应该在传递给BLL之前在DAL中完成对象到我们的自定义类型的转换,或者DAL是否应该传递原始类型并且BLL进行转换?

对象的转换应该在DAL进行。 转换后的对象应该传递给BLL。