Укороченная версия: Проще говоря, я хотел бы ввести IOptions<TModuleOptions> (или просто TModuleOptions) в модуль autofac, но я не могу понять, как это сделать, не подключив вручную класс параметров (что не так) . Возможно ли это вообще и как?

Более длинная версия: у меня есть проект ASP.NET Core 3.1, использующий Autofac в качестве контейнера DI, и модуль, для которого требуются некоторые параметры конфигурации. Например, имя и URL-адрес.

В стартапе у меня что-то вроде:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<ModuleOptions>(Configuration.GetSection(ModuleOptions.ModuleSettings));
    // Stuff remove for brevity
}

public void ConfigureContainer(ContainerBuilder builder)
{
    ModuleOptions options = options; // It would be nice with a way to get this here or have it resolved "automagically".
    builder.RegisterModule(new CustomModule());
}

Я пробовал разные вещи, но не понимаю, как я могу сделать это в "хорошей" манере.

Шкаф, который я получил, выполняет привязку конфигурации вручную следующим образом: var options = this.Configuration.GetSection("Something").Get<ModuleOptions>();

Он работает, но «кажется», что это не «идиоматический» основной способ работы с вещами .net.

Можно ли добиться того, чего я хочу, используя контейнер DI, аналогично тому, как я бы сделал это, если бы использовал MS DI или RegisterType(context => context.Resolve<IOptions<TModuleOptions>>())?

0
Esben Bach 26 Фев 2021 в 17:01

1 ответ

Лучший ответ

Вы не можете передать IOptions<T> в такой модуль, потому что это циклическая зависимость. Модуль выполняет регистрацию ... но для решения IOptions<T> вам необходимо построить контейнер, а это значит, что вы больше не можете регистрировать вещи.

Если подумать, это действительно правильное поведение, потому что технически IOptions<T> может в конечном итоге вызвать регистрацию чего-то другого, что повлияет на IOptions<T>, что изменит то, что регистрируется, что повлияет на IOptions<T> ... ага.

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

Причина, по которой вы можете отчасти DI-объекты в Startup, заключается в том, что внутри механизма размещения .NET Core создается два контейнера . Первый - это супер-баребоны, в нем есть конфигурация, ведение журнала и хостинг; второй - тот, который вы создаете как часть Startup, и является контейнером вашего приложения.

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

1
Travis Illig 26 Фев 2021 в 15:21