【发布时间】:2010-02-20 04:07:41
【问题描述】:
我有一个 asp.net mvc 网站,我在其中使用“Micorosoft.Practices.Unity”和“Microsoft.Practices.ObjectBuilder2”的依赖注入功能。通过将我的对象注入到我的控制器构造函数中,这一切都很好。
问题是当用户离开浏览器或想要注销时,我很难清除此会话。所有值都保留在对象中。如何销毁在 Session_End() 上的 global.asax 中创建的容器,或者通过用户单击并通过控制器操作来处理。
下面是一些示例代码。
Global.asax - 由Session_start 执行:
protected static void RegisterDependencies()
{
IUnityContainer container = new UnityContainer();
container.RegisterType<DataStore, DataStore>(new SessionLifetimeManager<DataStore>());
container.RegisterType<IMotorRepository, MotorRepository>(new SessionLifetimeManager<IMotorRepository>());
container.RegisterType<ICoverRepository, CoverRepository>(new SessionLifetimeManager<ICoverRepository>());
container.RegisterType<IDriverRepository, DriverRepository>(new SessionLifetimeManager<IDriverRepository>());
container.RegisterType<IVehicleRepository, VehicleRepository>(new SessionLifetimeManager<IVehicleRepository>());
container.RegisterType<ICodeValueRepository, CodeValueRepository>(new SessionLifetimeManager<ICodeValueRepository>());
ControllerBuilder.Current.SetControllerFactory(
new UnityControllerFactory(container)
);
}
SessionLifeTimeManager:
public class SessionLifetimeManager<T> : LifetimeManager, IDisposable
{
public override object GetValue()
{
return HttpContext.Current.Session[typeof(T).AssemblyQualifiedName];
}
public override void RemoveValue()
{
HttpContext.Current.Session.Remove(typeof(T).AssemblyQualifiedName);
}
public override void SetValue(object newValue)
{
HttpContext.Current.Session[typeof(T).AssemblyQualifiedName] = newValue;
}
public void Dispose()
{
RemoveValue();
}
}
【问题讨论】:
-
也许我弄错了,但你正在做的事情看起来很可怕,就像你试图拥有每个会话容器一样。我要说的第一件事是 - 除非你有逻辑调用' SetControllerFactory' 其他地方..你应该为受伤做好准备 - 因为 SetControllerFactory 为整个应用程序设置控制器工厂..而不是会话。
标签: asp.net-mvc dependency-injection