2016-04-07 3 views
1

У меня возникла странная проблема с использованием Autofac. У меня есть модуль, Load метод выглядит следующим образом:Регистрация модулей Autofac, действующих как async

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

Где вы на самом деле * строите * свой контейнер? И почему вы ожидаете, что метод «Load» будет вызван раньше, когда он понадобится? –

ответ

3

Все в Autofac зарегистрировано внутри как серия обратных вызовов. Когда вы вызываете RegisterModule, ContainerBuilder добавляет лямбда для вызова Load на модуле.

ContainerBuilder хранит все эти обратные вызовы, пока вы не вызовете Build, когда они, наконец, выполнят. Вот почему вы не сразу вызываете метод Load.

Невозможно изменить это.

Вместо этого, я бы настоятельно рекомендую только с использованием модулей для регистрации зависимостей и не имеют никаких побочных эффектов.