mvc 将 httpcontext 注入服务层

Mud*_*auf 5 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
        }
    }
Run Code Online (Sandbox Code Playgroud)

内部统一引导程序

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 
Run Code Online (Sandbox Code Playgroud)

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

Ant*_*t P 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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

更不用说您无论如何也无法执行此操作,因为当您在应用程序启动时注册类型时,没有要注册的实例(并且实例需要根据每个请求进行更改)。

附带说明 - 我希望这IWorkContext只是为了抽象 cookie 逻辑,而不是应用程序和数据层之间的层。如果不是,它根本不应该依赖于 HTTP 上下文。