我正在尝试在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容器?
答案 0 :(得分:1)
如何正确地将非空HttpContextWrapper实例注入我的IoC容器?
这些行涵盖所有3个案例(HttpContext
,HttpContext.Session
和HttpContext.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中完成的。