【问题标题】:How can you force Unity to Create a new instance?如何强制 Unity 创建新实例?
【发布时间】:2012-08-21 14:38:44
【问题描述】:

当我们在 WCF 上下文中调用 UnityContainer.Resolve<T>() 方法时,如何使用 Unity 应用程序块强制 Unity 配置创建对象的新实例?

【问题讨论】:

  • 您使用的是哪个生命周期管理器?另外,你想处理非托管对象吗?
  • 我没有配置生命周期管理器,我需要处理我的存储库对象
  • 为什么知道你的仓库对象没有被释放?
  • 如果我手动更新数据库,它不会反映在 Entity Framework 中,我还在 Dispose 方法中包含了一行来记录他在文本文件中调用方法并且日志没有被调用的事实已创建
  • 我知道了,嗯,Unity不支持为你调用Dispose,它只是释放引用,让GC收集。大多数 IoC,您需要手动处理

标签: c# wcf design-patterns dependency-injection unity-container


【解决方案1】:

Lifetime Manager 中的Unity 就是您所需要的。默认情况下,Unity 使用TransientLifetimeManager:

瞬态生命周期管理器。对于这个生命周期管理器,Unity 为每次调用 Resolve 或 ResolveAll 方法创建并返回请求类型的新实例。此生命周期管理器默认用于使用 RegisterType 方法注册的所有类型,除非您指定不同的生命周期管理器。

如果您需要使用另一个生命周期管理器,只需在Register 方法中指定:

var container = new UnityContainer();
container.RegisterType<IMyType, MyType>(new PerResolveLifetimeManager()); 

【讨论】:

    【解决方案2】:

    使用 RegisterType 而不使用 a LifetimeManager 应该在每次注入时注入该类型的新实例

    来自MSDN:

    如果不指定生命周期的值,则注册类型 对于一个短暂的生命周期,这意味着一个新的实例将是 在每次调用 Resolve 时创建

    【讨论】:

    • 这是可行的,但是现在当我在我的 WCF 应用程序中实现它时,它没有处理任何对象,有什么想法吗?
    • @AndyClark clark - 我们还使用 Unity 2.1.505、EF 4.3.1 和存储库模式,在 WCF 服务层下,也具有配置设置。一个区别可能是我们使用 WCF 服务行为来引导? rafatolotti.wordpress.com/2010/09/12/wcf-unity-app-block.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-13
    • 2011-07-15
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    相关资源
    最近更新 更多