WCF,统一 : Teardown disposable instances

标签 wcf unity-container idisposable

我们设置了一个 WCF 服务,它使用 Unity 容器来解析用于管理 Exchange 2010 Powershell 命令的实例。我们定义了一个 IExchangePowershell 接口(interface),该接口(interface)具有实现 IDisposable 的具体实现。一段时间后,我们遇到了无法执行 powershell 命令的问题,因为服务器说已经打开了太多的 powershell session 。似乎我们从未真正处理掉我们的 powershell 实例。具体 Powershell 的 Dispose() 方法将负责关闭运行空间和 session 。一旦我在存储库方法中调用它,我们就不会再收到错误了。

((IDisposable)this.powershell).Dispose();

现在当然我不想在每个存储库方法中显式调用 dispose 。我认为团结可以解决这个问题。我们的 WCF 实例提供程序这样做:
public void ReleaseInstance(InstanceContext instanceContext, object instance)
{
    container.Teardown(instance);
}

但这并没有真正处理 IExchangePowershell 实例。您知道我如何自动处理这些实例吗?

最佳答案

这实际上是 Unity 中众所周知的问题。 TearDown方法does nothing .如果你想使用 TearDown您必须创建自定义容器扩展。

我写了一个 article关于在 Unity 中使用对象生命周期管理器及其对处置的影响。如果使用默认 TransientLifetimeManagerPerResolveLifetimeManager Unity 甚至不会跟踪您的对象的存在,因此它无法调用 Dispose .唯一调用 Dispose 的终身经理在已解决的实例上是 ContainerControlledLifetimeManager (又名单例)和HierarchicalLifetimeManager . Dispose在释放生命周期管理器时调用。

您的解决方案是使用类型转换和处理 Dispose像你已经做的那样手动或切换到HiearchicalLifetimeManager并为每个传入的 WCF 请求创建新的子容器。每个子容器将只处理单个请求,并且它将处理具有分层生命周期的已解析实体。

还有其他方式,例如this article围绕 Unity 构建了一个非常复杂的代码以支持处理和 TearDown对于所有已解决的对象。

关于WCF,统一 : Teardown disposable instances,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5727544/

相关文章:

C# IUnityContainer 解析方法

.net - 如何正确使用实现 IDisposable 的静态属性?

c# - 如何正确管理 DataContext 的处置?

c# - RESTful WCF 服务在发送 "raw"XML 时返回 400 代码

c# - 无法通过浏览器访问 WCF 服务

c# - ReactiveExtensions 和异步服务方法?

wpf - PRISM/Unity IDisposable

c# - 自动完成扩展程序未填充

c# - 在 C# 的 Unity 注入(inject)容器中调用 RegisterType 的顺序有关系吗?

.net - 如何对 IDisposable 进行单元测试?