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

时间:2013-05-08 14:47:59

标签: c# autofac

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

我面临的问题是,某个组件必须在孩子LifetimeScope中解决,因为他们正在实施IDisposable并且必须予以处置。如果它们在根范围内得到解决,那将永远不会发生。

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

1 个答案:

答案 0 :(得分:1)

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

containerBuilder.RegisterType<Foo>()
                .As<IFoo>()
                .InstancePerMatchingLifetimeScope("scope");

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

有关详细信息,请参阅the Autofac wiki

相关问题