如何在 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
但不会看到scope2
或scope3
。
您也没有解释您对"最嵌套的生命周期范围"所做的工作,因此不清楚其中哪个是"最嵌套的" - 似乎scope2
scope3
都是同样嵌套的,那么哪个是正确的?
最后,还有一些线程问题需要考虑。如果你在异步方法中生成生存范围,或者做任何不同线程将创建不同作用域的事情,简单地跟踪[基本上]最后创建的作用域会给你带来一个麻烦的世界,你最终会尝试从一个作用域中解决问题,这个作用域存在于一个不再存在的线程上
。在非常非常有限的情况下,您不执行多线程/异步并且从未具有嵌套的生存期范围,也许处理事件是可以的。我不建议这个问题的未来读者遵循这条轨道。
更好的方法在某种程度上是不可能的,因为没有给出上下文。您是否有对范围的引用?你能把它传递到方法中,而不是试图神奇地找到它吗?有很多方法可以解决这个问题,但这里没有足够的方法来提供一个好的答案。考虑对此进行更多搜索,如果仍然没有产生任何结果,请提出一个新问题,其中包含更多信息,也许是重现,并对您尝试过的内容的更多解释。