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 делает свою работу, как вы, как это было бы:)

Другие вопросы по тегам