如何在WPF应用程序中获取最里面的autofac范围或命名范围?我需要这样做,因为我使用MarkupExtension来解析虚拟机。因此,在我的MarkupExtension中,我需要当前的(最里面的)Lifetimescope。
谢谢
我找到了一种方法...容器有一个事件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内部容器。如果有更好的方法,我全都为您提供建议。
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
是同等嵌套的,所以哪个是正确的?
最后,要考虑线程问题。如果您是在异步方法中生成生命周期作用域,或者在不同线程将创建不同作用域的情况下进行任何操作,则简单地[基本上]跟踪最后创建的作用域将使您陷入麻烦,最终您将尝试从一个问题中解决问题。作用域位于不再存在的线程上。
在实际上非常有限的情况下,您不执行多线程处理/异步操作,并且永远都没有嵌套的生存期作用域,也许可以处理该事件。 我不建议未来的问题读者关注此专题。
由于没有上下文,因此无法提供更好的方法。您对范围有参考吗?您可以将其传递给方法而不是尝试神奇地定位它吗?解决问题的方法有很多,但是这里没有足够的答案。考虑对此进行更多搜索,如果仍然无法产生任何结果,请问一个新问题,其中提供了更多信息,也许是repro,并且提供了有关您尝试操作的更多解释。