我在使用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
做什么导致这种不寻常的执行顺序?为什么?我该如何阻止它?
答案 0 :(得分:3)
Autofac中的所有内容都在内部注册为一系列回调。当您调用RegisterModule时,ContainerBuilder会添加一个lambda来调用模块上的Load。
ContainerBuilder保留所有这些回调,直到你最终执行时调用Build。这就是为什么你没有看到立即调用Load方法的原因。
无法改变这一点。
相反,我强烈建议仅使用模块来注册依赖项,不会产生任何副作用。