注入UnitOfWork依赖于HttpContext.Current

时间:2015-01-28 22:19:16

标签: c# asp.net-mvc dependency-injection unity-container unit-of-work

我正在尝试将每个新请求注入一个新的UnitOfWork实例到我的控制器中。

为此,我使用以下代码:

container.RegisterType<HttpContextBase>(new InjectionFactory(c => new HttpContextWrapper(HttpContext.Current)));

container.RegisterType<IEntitiesUnitOfWork, UnitOfWork>(new PerRequestLifetimeManager(),
                                                               new InjectionConstructor(
                                                                   new Func<Entities>(() => new Entities()),
                                                                   new InjectionParameter<User>(UserProvider.AuthenticationData.User)));

我的User中的UserProvider.AuthenticationData属性从当前HttpContext获取当前用户,因为我的UnitOfWork需要它:

if (HttpContext.Current != null && HttpContext.Current.User.Identity.IsAuthenticated)
{
    var authSession = HttpContext.Current.Session[SessionUserDataKey] as WebAuthenticationDataModel;
    if (authSession != null)
    {
        // use saved session
        return authSession;
    }

    // Reload user if session has been dropped
    [...]
}

但是,当访问HttpContext.Current时,它是null。

第一个来自我UnityConfig.GetConfiguredContainer()方法中UnityWebActivator.Start()的来电,我知道还没有上下文。所有后续调用在调用堆栈中都不可见,但最终来自控制器的构造函数。

奇怪的是,UnitOfWork已创建,但没有传入用户(以null传入)。

为什么?

2 个答案:

答案 0 :(得分:1)

在OnActionExecuting事件触发之前,HttpContext.Current不可用。

更好的问题是为什么你试图将HttpContext.Current注入控制器,因为它已经对它有一个真正的实时依赖。

答案 1 :(得分:1)

我认为您的注册过于复杂。只需使用InjectionFactory来允许注册创建UnitOfWork类及其依赖项的委托。类似的东西:

container.RegisterType<IEntitiesUnitOfWork>(
    new PerRequestLifetimeManager(),
    new InjectionFactory(c => 
        new UnitOfWork(new Entities(), UserProvider.AuthenticationData.User));