注册Autofac模块就像异步一样

时间:2016-04-07 22:28:42

标签: c# autofac autofac-module

我在使用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做什么导致这种不寻常的执行顺序?为什么?我该如何阻止它?

1 个答案:

答案 0 :(得分:3)

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

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

无法改变这一点。

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