将HttpContext注入到服务层的MVC模式

5

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

示例控制器:

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
        }
    }

在Unity引导程序内部

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个回答

3

我不会注入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 上下文。

0

提醒一下, 您可以按照TDD和MVC的这篇文章的方法,将http上下文模拟到控制器中:

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

如果无法注入HttpContextBase实例,请执行以下操作(在我的项目中有效!):
container.RegisterType(new InjectionFactory(c => new HttpContextWrapper(HttpContext.Current)));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接