只是一个简单的问题。在具有业务逻辑层(BLL)和数据访问层(DAL)的分层体系结构环境中,DAL应该将哪些类型传递给BLL?
目前,我们的DAL类生成DataTables和SQlDataReader对象(以及其他常见数据类型)。是否应该在传递给BLL之前在DAL中完成对象到自定义类型的转换,或者DAL是否应该传递原始类型并且BLL进行转换?
我试图想到将来可能会替换DAL层用于其他技术的场景。在那种情况下,听起来BLL应该期望转换数据类型,这样当切换时我们只需要确保我们的对象被返回?
任何明确的内容或阅读材料以清理内容都会有所帮助!
TIA
答案 0 :(得分: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返回Entity(普通c#类),您可以在DAL中切换技术,您的应用程序不受影响。 BLL中的操作由您决定。
在传递给BLL之前,是否应在DAL中完成对象到自定义类型的转换,或者DAL是否应该传递原始类型并且BLL进行转换?
对象的转换应该在DAL进行。转换后的对象应该传递给BLL。