Unity不尊重TransientLifetimeManager?

时间:2011-01-31 23:37:14

标签: .net wcf unity-container

我有以下情况:

包含服务实现层,业务层和数据层的WCF服务解决方案。 WCF实施层取决于数据层上的业务层和业务层。每个层通过构造函数注入接收它的依赖关系。我们使用Unity将它们连接在一起。我们有一个自定义WCF服务主机/因子/行为/实例提供程序,它们调用我们的Unity容器来解析要使用的WCF服务以及它的各种依赖项。

它工作得很好......差不多。

我们首先在数据层中使用EntityFramework代码。我们看到的是在初始调用WCF时创建了一个新的DbContext类,但该类在后续调用服务时被重用。当我们的服务正在为同时访问数据库的多个调用提供服务时,这当然成为一个问题。我能够通过在DbContext类的构造函数中放置一些跟踪语句来证明DbContext类实际上正被重用。我进一步向上链并在业务层实现构造函数中放置类似的trace语句,发现它也只被调用一次。实际上,似乎只在每个服务调用上构建WCF服务实现,并且数据和业务层的行为都是单例。

从我读过的内容来看,使用RegisterType与Unity一起使用TransientLifetimeManager时,默认行为就是Resolve,这意味着每次调用{{{{ 1}}。由于此默认行为似乎没有正常工作,我们尝试将生命周期管理器明确设置为TransientLifetimeManager,但我们仍然看到我们的业务和数据层表现为单例。

我需要做些什么来让我们的WCF依赖关系表现为单身?

更新:仍然没有成功。我尝试使用PerResolveLifetimeManager,但是没有解决问题。作为临时工作,我重构了我的代码,以便它将工厂注入我的数据层。工厂提供了DbContext实例,因此我能够确保每次调用我的数据层都使用新的DbContext。现在这个工作正常,但是我想解决导致Unity在创建后保留并重新使用实例的任何问题。

1 个答案:

答案 0 :(得分:0)

我们使用的方式:

  1. 我们使用HierarchicalLifetimeManager(以及其他服务)注册我们的DbContext。
  2. 在WCF实例中,我们创建新的子控制器并从此(子)容器解析服务。
  3. 使用[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
  4. 标记服务

    因此,HierarchicalLifetimeManager的神奇之处在于为每个请求提供了新的服务实例和所有相关数据。