我在基础设施层定义了我的接口,以使用依赖注入,但现在的问题是,如何在基础设施层和服务层使用接口解决 DBContext 的依赖关系,而不添加对 EF dll 的引用。
2 回答
如果您需要从应用程序中完全隐藏 EF,则需要使用存储库模式,将 EF 隐藏在存储库后面并生成(或编写)POCO 实体。
如果您更务实,则可以使用支持 IQueryable 的通用存储库,这可以提供出色的开发和单元测试体验,但选择什么取决于您。
您可以修改 T4 文件(也称为 T4 模板或 .tt 文件)以创建接口以及上下文,甚至可以将它们分成两个单独的 T4 文件,这样您就可以将它们放在单独的程序集中。您也可以使上下文返回 IQueryable 而不是 ObjectQuery,但是...
为了编写在数据库上而不是在内存中运行的优化查询,查询必须考虑到它们下面的技术,你不能编写通用查询,在内存列表上对它们进行单元测试,然后期望它们转换为 SQL正确并高效运行,无一例外。- 您必须在真实数据库(带有演示数据)上测试您的查询。
您应该做的是实现将 DAL 技术隐藏在其上层的服务,但在其实现内部使用 EF 的全部功能以尽可能高效地工作。
可以模拟这些服务,以测试它们之上的层,并且可以使用测试数据库(例如,使用由测试类创建和启动的 LOCALDB 实例)来测试服务本身以及它们对 EF 的使用。
许多相关链接中的一些:
使用 EF 4.1 的通用存储库有什么意义
ASP.NET MVC3 和实体框架代码优先架构
UnitOfWork 和 GenericRepository 模式在 EF 4.1 代码优先中是多余的吗?
https://softwareengineering.stackexchange.com/questions/133448/unit-integration-testing-my-dal