获取 WPF 应用程序中最内部范围的 Autofac



如何在 WPF 应用程序中获取最里面的 autofac 作用域或命名作用域? 我需要这个,因为我使用标记扩展来解析VM。所以在我的标记扩展中,我需要当前(最里面的(生命周期范围。

谢谢

我找到了一种方法... 容器有一个事件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但不会看到scope2scope3

您也没有解释您对"最嵌套的生命周期范围"所做的工作,因此不清楚其中哪个是"最嵌套的" - 似乎scope2scope3都是同样嵌套的,那么哪个是正确的?

最后,还有一些线程问题需要考虑。如果你在异步方法中生成生存范围,或者做任何不同线程将创建不同作用域的事情,简单地跟踪[基本上]最后创建的作用域会给你带来一个麻烦的世界,你最终会尝试从一个作用域中解决问题,这个作用域存在于一个不再存在的线程上

。在非常非常有限的情况下,您不执行多线程/异步并且从未具有嵌套的生存期范围,也许处理事件是可以的。我不建议这个问题的未来读者遵循这条轨道。

更好的方法在某种程度上是不可能的,因为没有给出上下文。您是否有对范围的引用?你能把它传递到方法中,而不是试图神奇地找到它吗?有很多方法可以解决这个问题,但这里没有足够的方法来提供一个好的答案。考虑对此进行更多搜索,如果仍然没有产生任何结果,请提出一个新问题,其中包含更多信息,也许是重现,并对您尝试过的内容的更多解释。

相关内容

  • 没有找到相关文章

最新更新