我创建了一个扩展方法来控制EF上下文的生命周期。我的代码在
下面public static Entities GetCentralRepositoryContext(this HttpContext httpcontext)
{
if (HttpContext.Current.Items["context"] == null)
{
HttpContext.Current.Items["context"] = new Entities();
}
return (Entities)HttpContext.Current.Items["context"];
}
我在我的解决方案中创建了许多层作为项目,并开始考虑IOC。上面的代码位于我的BL层项目中,但为了使其工作,我需要创建一个对我的DL层的引用,因为这是实体类所在的位置。我如何删除我的DL层的引用,并注入到我的扩展方法。这可能吗?
您采用的方法有几个问题。首先,静态方法往往是松耦合的一个问题,在尝试对代码进行单元测试时,您很快就会注意到这一点。除此之外,你的业务层依赖于System.Web
,这使得你的业务层技术特定,这将使它很难移动系统的一部分,例如Windows服务,并再次使单元测试几乎不可能。
与其这样做,不如开始将Entities
类注入到需要它的所有类型的构造函数中。在每个请求的开始,您可以构建应用程序中特定于该请求的服务的依赖关系图。在这一点上,你可以确定Entities
实例应该有一个web请求的生命周期。
当您开始编写单元测试时,您会发现在应用程序中直接使用EF ObjectContext
是非常困难的。本文可能会给您一些关于如何在可测试接口后面抽象ObjectContext
的想法。