У меня возникла странная проблема с использованием 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
, что делает этот необычный порядок исполнения? Зачем? Как остановить его?
Где вы на самом деле * строите * свой контейнер? И почему вы ожидаете, что метод «Load» будет вызван раньше, когда он понадобится? –