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