2011-01-31 105 views
2

我有以下情形:Unity不遵守TransientLifetimeManager?

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

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

我们在我们的数据层中首先使用EntityFramework代码。我们所看到的是在初始调用WCF时创建了一个新的DbContext类,但该类在后续对该服务的调用中被重用。当我们的服务正在服务多个同时访问数据库的调用时,这就成了一个问题。我能够证明DbContext类实际上是通过在DbContext类的构造函数中放置一些跟踪语句来重用的。我走了更远的链,并在业务层实现构造函数中放置类似的跟踪语句,并发现这也只被调用一次。事实上,似乎只有服务实施正在构建在每个服务调用上,并且数据和业务层表现为单身。

从我读过的东西,这听起来像默认行为时使用RegisterType与团结是使用TransientLifetimeManager并认为这意味着一个新的实例会在每次调用Resolve创建。由于此默认行为没有出现错误,因此我们尝试明确将终身管理器设置为TransientLifetimeManager,但我们仍然看到我们的业务层和数据层表现为单身。

关于我需要做什么才能让我们的WCF依赖项表现为单例的任何想法?

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

+0

默认生命时间管理器是ContainerControlledLifetimeManager http://msdn.microsoft.com/en-us/library/ff648098.aspx – onof 2011-02-01 11:17:36

回答

0

方式:

  1. 我们注册我们的HierarchicalLifetimeManager(和其他服务)的DbContext。
  2. 在WCF实例中,我们提供了创建新的子控制器并解析来自此(子)容器的服务。与[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]

  • 马克服务,所以,HierarchicalLifetimeManager的魔力给了我们服务的新实例,并为每个请求的所有相关数据。