我正在考虑使用Unity来管理自定义user类实例的生命周期。我计划用一个自定义的ASP.NET会话管理器来扩展LifetimeManager。我希望能够做的是从我的自定义类中存储和检索当前登录的user对象,并让Unity从ASP.NET中的session对象中获取User的实例,或者(当在Win32项目中时)静态地或从当前线程中检索它。
到目前为止,我最好的解决方案是在启动时创建Unity容器的静态实例,并使用Resolve方法从我的每个类中获取User对象。然而,这似乎在我的其他类中创建了对unity容器的依赖。实现这一目标的更“团结”的方式是什么?我希望能够从任何类读取/替换当前的User实例。
发布于 2010-07-29 14:07:39
当你使用Unity MVC而不是普通的ASP.Net项目时,你会得到最好的效果。MVC允许你使用像Unity这样的容器来管理用户对象、控制器、模型等。如果可能的话,在你的项目中使用ASP.Net而不是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生命周期管理编写一个类似的脚本。
发布于 2009-05-23 15:58:15
为什么不使用缓存对象instead...then,你可以在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中运行
发布于 2009-04-01 20:11:31
我认为您需要两个通过unity公开的服务(或者一个同时执行两个操作的服务)。
不存储user对象,而是存储一个接口实现,该接口实现公开一个方法/属性,该方法/属性将为您获取user对象。在ASP.NET中,您将从会话中检索用户。在WinForm解决方案(或其他解决方案)中,您可以从正在执行的线程中获取它。
您还将拥有一个set方法/属性,用于设置用户。
https://stackoverflow.com/questions/707138
复制相似问题