httpcontext扩展和IOC注意事项



我创建了一个扩展方法来控制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请求的生命周期。

然而,如果没有DI框架,这将开始变得麻烦。或者至少,一个DI框架将使这更容易做到。

当您开始编写单元测试时,您会发现在应用程序中直接使用EF ObjectContext是非常困难的。本文可能会给您一些关于如何在可测试接口后面抽象ObjectContext的想法。

最新更新