检查组件是否在最外层的LifetimeScope中解析

Der*_*all 6 c# autofac

我正在重新编写现有的代码库,以便更好地使用autofac容器.我遇到的情况是,很多东西都是用经典的ServiceLocator反模式直接从容器中解决它们的组件.我正在使用引入适当的工作单元方案LifetimeScope.

我面临的问题是,某些组件必须在LifetimeScope实施时从孩子身上解决IDisposable,必须予以处置.如果它们在根范围内得到解决,那将永远不会发生.

有没有办法阻止在根范围内解析某些组件?崩溃的运行时可以做到这一点,因为我将逐一介绍这些情况并根据需要引入范围.我能想到的唯一方法就是创建一个小的虚拟组件,它可以为根生存范围解析一次并解析,在.InstancePerLifetimeScope()某个地方静态存储.然后,当解析后面的组件时,我将获得其中一个虚拟组件,并查看它是否与根范围中生命的组件相同.虽然它有点笨拙,还有更好的方法吗?

Eri*_*erk 1

您可以尝试使用“每个匹配生命周期范围”注册:

containerBuilder.RegisterType<Foo>()
                .As<IFoo>()
                .InstancePerMatchingLifetimeScope("scope");
Run Code Online (Sandbox Code Playgroud)

IFoo只有当至少一个祖先生命周期范围是带标签的生命周期范围并且其标签等于时,才能解决这种方式"scope"。根生命周期范围通常没有标记,因此当您尝试IFoo从中解析时,Autofac 将抛出异常。

有关详细信息,请参阅Autofac 维基。