Получите Autofac Inner-Most область в приложении WPF - PullRequest
0 голосов
/ 09 октября 2019

Как я могу получить внутреннюю область автозапуска или именованную область в приложении WPF? Мне это нужно, потому что я использую MarkupExtension для разрешения виртуальной машины. Так что в моем MarkupExtension мне нужен текущий (самый внутренний) Lifetimecope.

Спасибо

Ответы [ 2 ]

0 голосов
/ 09 октября 2019

Для приложений WPF не существует родной интеграции типа «время жизни запроса». Если вы создаете вложенные области действия на всю жизнь, вы можете их отслеживать. Вам необходимо отслеживать ваши собственные жизненные области - как для создания, так и для утилизации. Возможно, у вас есть какая-то локальная переменная, которую вы установили, может быть, у вас есть какой-то другой механизм.

Однако, простое добавление обработчика событий в контейнер не сделает этого.

Каждая область жизни имеет свое собственное событие для начала дочерних областей действия.

Допустим, у вас есть это:

var builder = new ContainerBuilder();
var container = builder.Build();
var scope1 = container.BeginLifetimeScope();
var scope2 = scope1.BeginLifetimeScope();
var scope3 = scope1.BeginLifetimeScope();

При присоединении события к контейнеру не будут найдены вложенные областивне контейнера. Он увидит scope1, но не увидит scope2 или scope3.

Вы также не объяснили, что делаете с «самой вложенной областью действия на всю жизнь», поэтому это не так. Понятно, какой из них является «наиболее вложенным» - похоже, что scope2 и scope3 одинаково вложены, так что какой из них правильный?

Наконец, есть вопросы, которые нужно рассмотреть. Если вы порождаете жизненные области в асинхронных методах или делаете что-то, где разные потоки будут создавать разные области, простое отслеживание [в основном] последней созданной области действия приведет вас в мир проблем, где вы в конечном итоге попытаетесь решить проблемы с помощьюобласть видимости, которая существует в потоке, которого больше нет.

В действительно очень ограниченном случае, когда вы не выполняете многопоточность / асинхронность и никогда не имеете вложенных областей времени жизни, возможно, обработка события - это нормально. Я бы не советовал будущим читателям вопроса следовать этой дорожке.

Лучший способ обеспечить несколько невозможно, потому что нет заданного контекста. У вас есть ссылка на объем? Можете ли вы передать его в метод, а не пытаться найти его волшебным образом? Есть много способов решить проблему, но здесь недостаточно, чтобы дать хороший ответ. Подумайте о том, чтобы провести еще несколько поисков по этому вопросу, и, если это все еще ничего не даст, задайте новый вопрос с гораздо большим количеством информации, возможно, повторением и более подробным объяснением того, что вы пытались.

0 голосов
/ 09 октября 2019

Я нашел способ ... В контейнере есть событие ChildLifetimeScopeBeginning(object sender, ILifetimeScopeBeginningEventArgs args), которое я могу использовать для своих MakupExtensions, например:

    Container.ChildLifetimeScopeBeginning += (sender, args) =>
            { 
                Debug.Write($"Begin new LifetimeScope: {args.LifetimeScope.Tag??"Unnamed"}");
                //Set the current Lifetime scope for the MarkupExtension
                ContainerTypeResolverExtension.Container = args.LifetimeScope;
            };

Так что теперь, когда создается каждая новая область, я могу заменить внутреннюю MarkupExtensionконтейнер. Если есть лучший способ, я все для предложений.

...