IDisposable Singleton с StructureMap 4 & NestedContainer
Я ищу, чтобы зарегистрировать EasyNetQ IBus
который реализует IDisposable
как синглтон с StructureMap.
Проблема заключается в том, что при использовании вложенного контейнера экземпляр удаляется вместе с контейнером, поэтому у меня остается одноэлементный экземпляр для всех остальных контейнеров.
For<IBus>()
.Use(c => BusBuilder.CreateMessageBus())
.Singleton();
ContainerScoped
это не вариант здесь, так как мне нужно, это сохраняется в течение всего срока службы приложения.
Как запретить StructureMap избавляться от этого экземпляра с вложенными контейнерами? Как мне сказать, чтобы он удалял экземпляр только с корневым контейнером?
1 ответ
Я знал, что что-то не так с моей проблемой. Какой смысл определять синглтоны, если они располагаются вместе с каждым контейнером?
Действительно, StructureMap не удаляет одноэлементные объекты, пока не будет удален корневой контейнер, см. Исходный код PipelineGrap.cs.:
if (Role == ContainerRole.Root)
{
_profiles.AllProfiles().Each(x => x.Dispose());
}
Оказалось, что мой IBus
экземпляр был вручную удален каким-то таинственным устаревшим кодом, в который он был внедрен.
В любом случае, для тех, кто сталкивается с той же проблемой: отследить ваш звонок Dispose
как StructureMap делает свою работу, как вы, как это было бы:)