mvc将httpcontext注入服务层

时间:2013-12-02 18:46:01

标签: asp.net-mvc unity-container code-injection

在将httpContextBase注入到使用unity注入控制器的服务级别对象时,我遇到了一个大问题。

样本控制器

public HomeController : Controller{
    private IWorkContext _context;

    public HomeController(IWorkContext context){
        _context = context;
    }

}


public WorkContext : IWorkContext{

    private HttpContextBase _httpContext;

        public (HttpContextBase httpContext){
            _httpContext = httpContext;
        }

        public void DealWithCookies(){
            //do some thing with http context and deal with cookies
        }
    }

内部统一引导程序

container.RegisterType<HttpContextBase>().RegisterInstance(new HttpContextWrapper(HttpContext.Current) as HttpContextBase, new ContainerControlledLifetimeManager());

//With this line httpcontextbase is returned but as a singleton instead of new for each request.


   container.RegisterType<HttpContextBase>().RegisterInstance(new HttpContextWrapper(HttpContext.Current) as HttpContextBase, new PerRequestLifetimeManager());

//This line returns an exception 

HttpContextBase类型没有可访问的构造函数。

2 个答案:

答案 0 :(得分:2)

我根本不会注入HttpContext - 我会将其传递给每个方法调用:

public WorkContext : IWorkContext{

    private HttpContextBase _httpContext;

    public WorkContext(){
        ...
    }

    public void DealWithCookies(HttpContext ctx){
        //do some thing with http context and deal with cookies
    }
}

在这里试图使用依赖注入似乎是对我的原则的挪用。依赖注入允许您松散地耦合组件,但这里不需要它,因为您可以将上下文传递给方法并直接操作它。没有提供具体实现的接口,因此对DI没有任何好处 - 它只是不必要的自举和“反模式”缺乏结构。

更不用说你无论如何都无法做到这一点,因为当你在应用程序启动时注册你的类型时,没有实例要注册(并且实例需要在每个请求上进行更改)。

旁注 - 我希望IWorkContext仅用于抽象cookie逻辑,而不是应用程序和数据层之间的层。如果没有,它根本不应该依赖于HTTP上下文。

答案 1 :(得分:0)

FYI 您可以根据TDD和MVC上的这篇文章将http上下文模拟到控制器中:

http://msdn.microsoft.com/en-us/library/ff847525(v=vs.100).aspx

如果没有注入HttpContextBase实现的实例,请执行以下操作(在我的项目中工作!!):

container.RegisterType(new InjectionFactory(c =&gt; new HttpContextWrapper(HttpContext.Current)));