我正在尝试将每个新请求注入一个新的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
传入)。
为什么?
答案 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));