带有 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 正在按照您的方式进行工作:)
我想注册一个 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 正在按照您的方式进行工作:)