使用ASP.NET Session进行终身管理(Unity)

17 c# asp.net session unity-container

我正在考虑使用Unity来管理自定义用户类实例的生命周期.我计划使用自定义ASP.NET会话管理器扩展LifetimeManager.我希望能够做的是从我的自定义类存储和检索当前登录的用户对象,并让Unity从ASP.NET中的会话对象获取User的实例,或者(在Win32项目中时)检索它静态地或从当前线程.

到目前为止,我最好的解决方案是在启动时创建Unity容器的静态实例,并使用Resolve方法从我的每个类中获取我的User对象.但是,这似乎在我的其他类中创建了对unity容器的依赖.实现这一目标的"团结"方式是什么?我希望能够从任何类中读取/替换当前的User实例.

小智 15

当与ASP.Net MVC一起使用而不是普通的旧ASP.Net项目时,你将获得与Unity最好的结合.ASP.Net MVC允许您使用像Unity这样的容器来管理用户对象,控制器,模型等.如果可能,请为您的项目使用MVC而不是ASP.net Web表单.

如果我正确理解您的问题,您可能希望使用Unity来维护每个会话对象的生命周期.您需要实现扩展LifetimeManager的SessionLifetimeManager.代码非常简单,并遵循以下几点:

public class SessionLifetimeManager : LifetimeManager
{
    private string _key = Guid.NewGuid().ToString();

    public override object GetValue()
    {
          return HttpContext.Current.Session[_key];
    }

    public override void SetValue(object value)
    {
          HttpContext.Current.Session[_key] = value;
    }

    public override void RemoveValue()
    {
          HttpContext.Current.Session.Remove(_key);
    }
}
Run Code Online (Sandbox Code Playgroud)

您也可以为PerWebRequest生命周期管理编写类似的一个.


cas*_*One 0

我认为您需要通过统一公开的两项服务(或一项执行这两项操作的服务)。

不要存储用户对象,而是存储一个接口实现,该实现公开将为您获取用户对象的方法/属性。在 ASP.NET 情况下,您从会话中检索用户。在 WinForm 解决方案(或其他解决方案)中,您可以从执行线程获取它。

您还可以有一个 set 方法/属性,用于设置用户。