WCF,Unity:拆解一次性实例

hoe*_*etz 6 wcf idisposable unity-container

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

((IDisposable)this.powershell).Dispose();
Run Code Online (Sandbox Code Playgroud)

现在我当然不希望在每个存储库方法中显式调用dispose.我认为团结可以解决这个问题.我们的WCF实例提供程序执行此操作:

public void ReleaseInstance(InstanceContext instanceContext, object instance)
{
    container.Teardown(instance);
}
Run Code Online (Sandbox Code Playgroud)

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

Lad*_*nka 10

这实际上是Unity中众所周知的问题.TearDown方法什么也没做.如果要使用TearDown,则必须创建自定义容器扩展.

我写了一篇关于在Unity中使用对象生命周期管理器及其对处置的影响的文章.如果使用默认值,TransientLifetimeManager或者PerResolveLifetimeManagerUnity甚至不会跟踪对象的存在,因此无法调用Dispose.调用已Dispose解析实例的唯一生命周期管理器ContainerControlledLifetimeManager(也称为单例)和HierarchicalLifetimeManager.的Dispose寿命管理器被设置时被调用.

您的解决方案是Dispose手动使用强制转换和手柄,或者HiearchicalLifetimeManager为每个传入的WCF请求切换并创建新的子容器.每个子容器只处理单个请求,它将处理具有层次生命周期的已解析实体.

还有其他方法,例如本文围绕Unity构建一个非常复杂的代码,以支持处理和TearDown所有已解析的对象.