尝试将类型注册到IoC容器时,HttpContext.Current为null

时间:2018-02-28 15:34:47

标签: c# asp.net-mvc dependency-injection asp.net-mvc-5 unity-container

我正在尝试在ASP.NET MVC 5应用程序中设置IoC容器,这样我就可以在我的应用程序中的任何位置访问这些对象。

我选择使用Unity.Mvc容器来完成这项工作。

在我的类型注册步骤中,我正在尝试运行以下代码

var httpContext = new HttpContextWrapper(HttpContext.Current);
container.RegisterInstance<HttpContextBase>(httpContext);

var sessionWrapper = new HttpSessionStateWrapper(HttpContext.Current.Session);
container.RegisterInstance<HttpSessionStateBase>(sessionWrapper);

var httpServerUtility = new HttpServerUtilityWrapper(HttpContext.Current.Server);
container.RegisterInstance<HttpServerUtilityBase>(httpServerUtility);

然而,由于HttpContext.Current.Session对象 null ,行HttpContext.Current会抛出一个空例外。

如何正确地将非空HttpContextWrapper实例注入我的IoC容器?

1 个答案:

答案 0 :(得分:1)

  

如何正确地将非空HttpContextWrapper实例注入我的IoC容器?

这些行涵盖所有3个案例(HttpContextHttpContext.SessionHttpContext.Server):

var httpContext = new HttpContextWrapper(HttpContext.Current);
container.RegisterInstance<HttpContextBase>(httpContext);

由于应用程序启动期间没有会话,因此您无法在MVC 5 Application Lifecycle的早期访问它们。

httpContext注入组件后,您可以访问应用程序 runtime 部分中的会话状态。

public class SomeService : ISomeService
{
    private readonly HttpContextBase httpContext;

    public SomeService(HttpContextBase httpContext)
    {
        if (httpContext == null)
            throw new ArgumentNullException(nameof(httpContext));
        this.httpContext = httpContext;
        // Session state is still null here...
    }

    public void DoSomething()
    {
        // At runtime session state is available.
        var session = httpContext.Session;
    }
}
  

注意:让您的服务直接依赖于会话状态通常不是一个好习惯。相反,您应该让控制器通过方法参数传递会话状态值(即DoSomething(sessionValue)),或者在SessionStateAccessor周围实现可以注入您的服务的HttpContextBase包装器,类似于它是在ASP.NET Core中完成的。