注入依赖于 HttpContext.Current 的 UnitOfWork

Injecting UnitOfWork with dependency on HttpContext.Current

我尝试在每个新请求中将一个新的 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)));

我的 UserProvider.AuthenticationData 中的 User 属性 从当前 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时,它是空的。

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

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

这是为什么?

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

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

我认为您的注册过于复杂。只需使用 InjectionFactory 即可注册一个创建 UnitOfWork class 及其依赖项的委托。类似于:

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