c# - 像异步一样注册 Autofac 模块

标签 c# autofac autofac-module

我在使用 Autofac 时遇到了一个奇怪的问题。我有一个模块,其 Load 方法如下所示:

builder.RegisterType<Foo>().As<IFoo>();
// ...

AddSomethingToAList(bar);
// ...

AddSomethingToAList 完全按照它在 jar 上所说的那样做,将资源添加到静态列表。它用于跟踪一些元数据并保存在模块内,因为此元数据与为依赖注入(inject)注册的类型直接相关。

然后我的代码有一个设置方法,如下所示:

var builder = new ContainerBuilder();
builder.RegisterModule(myModule);

foreach(var whatever in previouslyAddedToList)
{
    doSomething(whatever);
}

如您所见,我们注册了模块(我希望为该模块调用 Load),然后我们对加载模块时添加到的列表进行一些操作。

这是奇怪的部分:在向列表中添加任何内容之前先对列表进行处理。这是完全出乎意料的(如果代码是同步的和确定性的)。就好像模块正在被异步处理。如果我只是调用 myModule.Load(builder) 而不是 builder.RegisterModule(myModule),那么它会完全按预期工作。

文档中没有任何内容说它是异步的,而且看起来很不合适。我通过在模块的 Load 方法内和处理列表的点放置断点来遵循此行为。

那么 RegisterModule 到底在做什么导致了这种不寻常的执行顺序?为什么?我该如何阻止它?

最佳答案

Autofac 中的所有内容都在内部注册为一系列回调。当您调用 RegisterModule 时,ContainerBuilder 添加一个 lambda 用于调用模块上的 Load。

ContainerBuilder 会保留所有这些回调,直到您调用 Build,它们最终会执行。这就是为什么您看不到立即调用 Load 方法的原因。

没有办法改变这一点。

相反,我强烈建议仅使用模块来注册依赖项,不会有任何副作用。

关于c# - 像异步一样注册 Autofac 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36488321/

相关文章:

c# - 如何在 iTextSharp PDF Stamper 中使用 UTF-8 编码?

c# - 使用 Autofac 将 log4net 注入(inject) Controller

c# - Excel Interop : reference by number, 不是字符串

c# - 使用自定义方法构造 AndAlso/OrElse LINQ 表达式

c# - 尝试删除字符串的最后一个字符时出错

autofac - 如何在Autofac中注册循环类型?

c# - Autofac IComponentContext 与 ILifetimeScope

c# - Autofac 枚举不适用于类型或模块的多个注册

asp.net-web-api2 - Autofac 作业激活器与 Hangfire 抛出异常 DependencyResolutionException

c# - Autofac RegisterAssemblyTypes 来自测试