我在使用 Autofac 时遇到了一个奇怪的问题。我有一个模块,其Load
方法如下所示:
builder.RegisterType<Foo>().As<IFoo>();
// ...
AddSomethingToAList(bar);
// ...
在哪里AddSomethingToAList
完全按照它在锡上所说的那样,将资源添加到静态列表中。它用于跟踪一些元数据并保存在模块内,因为此元数据与为依赖注入注册的类型直接相关。
然后我的代码有一个设置方法,如下所示:
var builder = new ContainerBuilder();
builder.RegisterModule(myModule);
foreach(var whatever in previouslyAddedToList)
{
doSomething(whatever);
}
如您所见,我们注册了模块(我希望Load
为该模块调用),然后我们对加载模块时添加的列表做一些事情。
这是奇怪的部分:列表在添加任何内容之前得到处理。这是完全出乎意料的(如果代码是同步的和确定的)。就好像模块正在异步处理。如果不是builder.RegisterModule(myModule)
我只是打电话myModule.Load(builder)
,那么它完全按预期工作。
文档中没有任何内容说它是异步的,而且看起来很不合适。Load
我通过在模块的方法内和处理列表时放置断点来遵循这种行为。
那么到底是RegisterModule
什么导致了这种不寻常的执行顺序呢?为什么?我该如何阻止它?