gpt4 book ai didi

WCF,统一 : Teardown disposable instances

转载 作者:行者123 更新时间:2023-12-04 14:05:38 26 4
gpt4 key购买 nike

我们设置了一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com