2011-10-12 53 views
0

嗨创建了一个扩展方法来控制EF上下文的生命周期。我的代码是低于httpcontext扩展和IOC注意事项

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

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

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

但是,如果没有DI框架,这会变得非常麻烦。或者至少,DI框架将使这更容易做到。

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