我在基础设施层定义了我的接口,使用依赖注入,但现在问题是,如何在infrasturure层和服务层中使用接口解决DBContext的依赖关系,而不添加对EF dll的引用。
答案 0 :(得分:2)
如果您需要完全从应用程序中隐藏EF,则需要使用repository pattern,隐藏存储库后面的EF并生成(或写入)POCO实体。
如果你更务实,你可以use generic repositories with IQueryable support,它可以提供出色的开发和单元测试体验,但选择的是你自己。
答案 1 :(得分:0)
您可以修改T4文件(也称为T4模板或.tt文件)以创建界面以及上下文,甚至将它们分成两个单独的T4文件,因此您可以将它们放在单独的程序集中。您也可以使上下文返回IQueryable而不是ObjectQuery,但是......
为了编写在数据库而不是内存中运行的优化查询,查询必须考虑它们下面的技术,你不能编写通用查询,在内存列表中对它们进行单元测试,然后期望它们转换为SQL正确并高效运行,没有例外。 - 您必须在真实数据库上方测试您的查询(使用演示数据)。
你应该做的是实现将DAL技术隐藏在其上层的服务,但在其实现中使用EF的全部功能尽可能高效地工作。
可以模拟这些服务,测试它们上面的层,并且可以使用测试DB(例如,使用由测试类创建并启动的LOCALDB实例)来测试服务本身以及它们对EF的使用。
许多相关链接中的一些:
Generic Repository With EF 4.1 what is the point
ASP.NET MVC3 and Entity Framework Code first architecture
Is UnitOfWork and GenericRepository Pattern redundant In EF 4.1 code first?
https://softwareengineering.stackexchange.com/questions/133448/unit-integration-testing-my-dal