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

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

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

当与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); } } 

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

为什么不使用缓存对象…然后你可以从win和web使用它。 像这样:

  IUnityContainer container= HttpRuntime.Cache.Get("Unity") as IUnityContainer; if (container == null) { container= // init container HttpRuntime.Cache.Add("Unity", container, null, Cache.NoAbsoluteExpiration, Cache.NoSlidingExpiration, CacheItemPriority.NotRemovable, null); } // return container or something 

HttpRuntime.Cache将在win和web中运行

我认为你需要两个通过统一暴露的服务(或者一个服务同时执行这两个操作)。

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

您还可以使用set方法/属性来设置用户。

听起来实际上你需要注册表模式,而不是Unity。

http://martinfowler.com/eaaCatalog/registry.html

也许我在想这个,但我认为你应该使用AoP和IoC。 这真是一个美丽的配对。 基本上我要做的是劫持你正在解析的类的构造函数,否则称为创建一个方面。 然后,您可以在构造函数的入口处将用户注入到类中,但是解析该类的任何内容都不会明确地向用户提供,从而阻止与Unity本身的配对。

PostSharp是一个优秀的AoP框架恕我直言。

现在最终您的应用程序将依赖于AoP框架,但完全分离的应用程序可能不切实际,具体取决于您的环境。 你可能会惊讶于AoP和IoC的结合是多么有用。

如果您通过“自定义ASP.NET会话管理器”讨论NHibernate会话或Data / ObjectContext,那么您需要的是将IUserRepository注入到构造函数或属性setter中,您可以从中检索User对象。 IUserRepository的实现可以是从数据库访问到后端缓存等等。如果您直接在容器上使用.Resolve(),那么您将遵循服务定位器模式,并且不能正确地使用Unity来提供它所能提供的所有function。

然后,您可以使用Ravi的答案来管理存储库的生命周期。

如果这不太正确,我很抱歉……

Unity是一个游戏开发平台,因此我假设您正在构建一个3D应用程序或游戏,您打算做一些很酷的事情(例如,使用服务器让多人/跟踪用户进步)。

为什么不让每个用户登录,然后您可以使用MembershipProvider和Formsauthentication类来获取对用户ID /名称的访问权限。

在您的服务器上,您只需将所有信息链接到用户的信息,以便您轻松退回(简单的ajax /普通http请求)与情况/用户请求相关的数据。

我不确定这一点,但我相信统一是部署客户端的东西,因此不需要在服务器上进行集成。

只需要求您需要的东西并在客户端进行处理。

这样您就可以坚持使用经典的n层设计模式,从而将逻辑与数据存储和ui分开。

希望这可以帮助 …