httpcontext扩展和IOC注意事项

时间:2011-10-12 15:17:39

标签: c# entity-framework-4 inversion-of-control

您创建了一个扩展方法来控制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图层的引用并注入我的扩展方法。这甚至可能吗?

1 个答案:

答案 0 :(得分:1)

您正在采取的方法有几个问题。首先,静态方法往往是松散耦合的问题,在尝试对代码进行单元测试时,您会很快注意到这一点。除此之外,您的业务层依赖于System.Web,这使您的业务层技术特定,这将使得将系统的一部分移动到例如Windows服务变得非常困难,并且再次使得单元测试几乎不可能

不要这样做,而是开始将Entities类注入到需要它的所有类型的构造函数中。在每个请求开始时,您可以在应用程序中构建服务的依赖关系图,特定于该请求。此时,您可以确定Entities实例应具有Web请求的生命周期。

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

当您开始编写单元测试时,您会发现在应用程序中直接使用EF ObjectContext时会非常困难。 This article可能会为您提供一些如何抽象可测试界面背后的ObjectContext的想法。