6

我正在修改现有的代码库以更好地利用 autofac 容器。我遇到的情况是,很多东西都用来直接从容器中以经典的ServiceLocator反模式解析它们的组件。我正在使用LifetimeScope.

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

有什么办法可以防止某些组件在根范围内被解析?崩溃运行时对此是可以的,因为我将一一处理这些案例并根据需要引入范围。我能想到的唯一方法是创建一个小虚拟组件,该组件在根生命周期范围内解析一次并解析.InstancePerLifetimeScope(),并将其静态存储在某处。然后,当解决以后的组件时,我将获得其中一个虚拟组件,并查看它是否与根范围内的实例相同。虽然有点笨拙,有没有更好的方法?

4

1 回答 1

1

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

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

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

有关更多信息,请参阅Autofac wiki

于 2013-07-23T12:13:14.717 回答