在WPF应用程序中获取Autofac最内层作用域

问题描述 投票:0回答:2

如何在WPF应用程序中获取最里面的autofac范围或命名范围?我需要这样做,因为我使用MarkupExtension来解析虚拟机。因此,在我的MarkupExtension中,我需要当前的(最里面的)Lifetimescope。

谢谢

wpf mvvm autofac markup-extensions lifetime-scoping
2个回答
0
投票

我找到了一种方法...容器有一个事件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内部容器。如果有更好的方法,我全都为您提供建议。


0
投票

WPF应用程序没有本地的“请求生存期”集成。如果要创建嵌套生命周期作用域,则由您来跟踪它们。跟踪自己的生命周期范围(包括创建和处置)的需求完全由您决定。也许您设置了某种局部变量,也许您还有其他机制。

但是,仅在容器上添加事件处理程序不会这样做。

每个生存期范围对于子生存期范围开始都有其自己的事件。

假设您有这个:

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

向容器添加事件将找不到嵌套在容器外部的作用域。它会显示scope1,但不会看到scope2scope3

[您也没有解释“最嵌套的生命周期范围”在做什么,因此尚不清楚其中哪个是“最嵌套的”-似乎scope2scope3是同等嵌套的,所以哪个是正确的?

最后,要考虑线程问题。如果您是在异步方法中生成生命周期作用域,或者在不同线程将创建不同作用域的情况下进行任何操作,则简单地[基本上]跟踪最后创建的作用域将使您陷入麻烦,最终您将尝试从一个问题中解决问题。作用域位于不再存在的线程上。

在实际上非常有限的情况下,您不执行多线程处理/异步操作,并且永远都没有嵌套的生存期作用域,也许可以处理该事件。 我不建议未来的问题读者关注此专题。

由于没有上下文,因此无法提供更好的方法。您对范围有参考吗?您可以将其传递给方法而不是尝试神奇地定位它吗?解决问题的方法有很多,但是这里没有足够的答案。考虑对此进行更多搜索,如果仍然无法产生任何结果,请问一个新问题,其中提供了更多信息,也许是repro,并且提供了有关您尝试操作的更多解释。

© www.soinside.com 2019 - 2024. All rights reserved.