带有 StructureMap 4 和 NestedContainer 的 IDisposable Singleton

IDisposable Singleton with StructureMap 4 & NestedContainer

我想注册一个 EasyNetQ 的 IBus,它将 IDisposable 实现为带有 StructureMap 的单例。
问题是当使用嵌套容器时,实例与容器一起处理,因此给我留下了一个为每个其他容器处理的单例实例。

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

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

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

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

实际上,StructureMap 不会处理单例对象,除非正在处理根容器,请参阅 the PipelineGrap.cs source code. :

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

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

无论如何,对于面临相同问题的任何人:追踪您对 Dispose 的调用,因为 StructureMap 正在按照您的方式进行工作:)