17

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

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

4

7 回答 7

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

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

于 2010-07-29T06:07:38.527 回答
2

为什么不使用缓存对象...然后您可以从 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-05-23T15:58:15.323 回答
0

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

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

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

于 2009-04-01T20:11:31.140 回答
0

Sounds like actually you need Registry pattern, not Unity.

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

于 2009-05-16T04:38:15.470 回答
0

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

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

于 2010-08-02T23:23:35.060 回答
0

也许我想太多了,但我认为您应该将 AoP 与 IoC 一起使用。这真是一个美丽的配对。本质上,我要做的是劫持您正在解析的类的构造函数,否则称为创建方面。然后,您可以在进入构造函数时将用户注入到类中,但是无论解决该类的问题,都不必显式地提供给用户,从而防止与 Unity 本身配对。

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

现在最终您的应用程序将依赖于 AoP 框架,但是根据您的环境,完全解耦的应用程序可能是不现实的。您可能会惊讶于 AoP 和 IoC 的组合有多么有用。

于 2010-08-02T01:16:27.443 回答
-5

如果这不太正确,我很抱歉,但是......

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

为什么不让每个用户都登录,那么您可以使用 MembershipProvider 和 Formsauthentication 类来访问用户 id/name。

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

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

只需请求您需要的内容并在客户端进行处理。

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

希望这可以帮助 ...

于 2010-05-17T14:27:07.450 回答