【问题标题】:Unity to return new instance of service统一返回新的服务实例
【发布时间】:2009-12-11 16:41:42
【问题描述】:

我在使用 Unity 和 WPF 时遇到了一些问题。场景是我有一个遵循 MVVM 设计模式的 WPF 应用程序。 A 有一个名为 ViewKDI 的模块。在这个模块中,我有一个名为 ViewKDIService 的服务,ViewKDIService 服务利用另一个名为 UserService 的服务。

每次我加载 ViewKDI 模块时,我都希望 Unity 返回 ViewKDIService 和 UserService 的新实例。

我已将以下内容放入 shell 引导程序中:

Container.RegisterType<IUserService, UserService>();

在 ViewKDI 模块中,我添加了以下内容:

Container.RegisterType<IViewKDIService, ViewKDIService>();

每次 ViewKDI 模块加载时都会调用 ViewKDIService 构造函数。但是 UserService 构造函数只在第一次被调用,这意味着我没有得到一个新的 UserService 实例。

我也需要 unity 给我一个新的 UserService 实例,以便我可以将这个会话与应用程序的其余部分分开管理。

有什么想法吗?

谢谢 费萨尔

【问题讨论】:

  • 您能否提供更多关于您何时解析每种类型的详细信息? IUserService 是 ViewKDIService 的依赖项吗?
  • 我没有显式调用 resolve,我只是将接口放入我的 ViewModel 的构造函数中,并让 Unity 解决它们。 IUserService 不依赖于 IViewKDIService。
  • 查看注入了哪些对象 IUserService 和 IViewKDIService 有助于了解它们的生命周期。例如都注入到您的 ViewModel 或只是 IUserService?

标签: wpf unity-container


【解决方案1】:

Unity 的默认行为是在每次请求一个对象时为每个对象创建一个新实例,因此您不应该看到这种行为。

根据我从源代码和 MSDN 文档中收集到的信息(this 很好读),您可以在注册类型时指定一个“生命周期管理器”对象来告诉 Unity 应该如何构造和缓存该类型.使用 TransientLifetimeManager(本质上没有缓存)会导致 Unity 每次都重新创建类。所以试试这个:

Container.RegisterType<IUserService, UserService>(new TransientLifetimeManager());

...看看它是否每次都创建一个新的 UserService。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 2019-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    相关资源
    最近更新 更多