我有一個asp.net mvc網站,我使用「Micorosoft.Practices.Unity
」和「Microsoft.Practices.ObjectBuilder2
」的依賴注入功能。這一切都很好,將我的對象注入到我的控制器構造函數中。ASP.NET MVC依賴注入與UnityContainer會話狀態
問題是,當用戶離開瀏覽器或想要註銷時,我很難清除此會話。所有的值都保留在對象中。我該如何取消在global.asax中創建的容器,或者是由用戶點擊並由控制器操作保管的Session_End()
。
下面是一些示例代碼。
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爲整個應用程序設置了控制器工廠..而不是會話。 – meandmycode 2009-06-14 20:36:51