0

我正在寻找一个 EasyNetQ IBus,它通过 StructureMap 实现IDisposable为单例。
问题是在使用嵌套容器时,该实例与容器一起处置,因此我为每个其他容器处置了一个单例实例。

For<IBus>()
    .Use(c => BusBuilder.CreateMessageBus())
    .Singleton();

ContainerScoped在这里不是一个选项,因为我需要在整个应用程序生命周期内保持活动状态。

如何防止 StructureMap 使用嵌套容器处理此实例?如何告诉它仅使用根容器处理实例?

4

1 回答 1

1

我知道我的问题有些奇怪。如果将它们与每个容器一起处理,那么定义单例有什么意义?

实际上,除非正在处置根容器,否则 StructureMap 不会处置单例对象,请参阅PipelineGrap.cs 源代码。

if (Role == ContainerRole.Root)
{
    _profiles.AllProfiles().Each(x => x.Dispose());
}

事实证明,我的IBus实例是被一些神秘的遗留代码手动处理的,它被注入其中。

无论如何,对于任何面临同样问题的人:追踪您的呼叫,Dispose因为 StructureMap 正在按照您的方式完成它的工作 :)

于 2017-07-07T13:56:48.283 回答