删除EF DBContext和基础结构层的耦合

时间:2012-06-15 23:00:46

标签: c# entity-framework dependency-injection inversion-of-control ioc-container

我在基础设施层定义了我的接口,使用依赖注入,但现在问题是,如何在infrasturure层和服务层中使用接口解决DBContext的依赖关系,而不添加对EF dll的引用。

2 个答案:

答案 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