У меня есть основное приложение dotnet.
Мой Startup.cs
регистрирует типы / реализации в Autofac.
Для одной из моих регистраций требуется предыдущий доступ к услуге.
var containerBuilder = new ContainerBuilder();
containerBuilder.RegisterSettingsReaders(); // this makes available a ISettingsReader<string> that I can use to read my appsettings.json
containerBuilder.RegisterMyInfrastructureService(options =>
{
options.Username = "foo" //this should come from appsettings
});
containerBuilder.Populate(services);
var applicationContainer = containerBuilder.Build();
Дилемма заключается в том, что к тому времени, когда мне нужно .RegisterMyInfrastructureService
, мне нужно иметь доступ к ISettingsReader<string>
, который был зарегистрирован как раз перед этим (контейнер Autofac еще не был построен).
Я читал о регистрации с помощью обратного вызова для выполнения чего-либо после того, как контейнер autofac был собран. Так что я мог бы сделать что-то вроде этого:
builder.RegisterBuildCallback(c =>
{
var stringReader = c.Resolve<ISettingsReader<string>>();
var usernameValue = stringReader.GetValue("Username");
//now I have my username "foo", but I want to continue registering things! Like the following:
containerBuilder.RegisterMyInfrastructureService(options =>
{
options.Username = usernameValue
});
//now what? again build?
});
но проблема в том, что после того, как я хочу использовать службу, нужно не делать что-то вроде запуска службы или аналогичного , а продолжать регистрировать вещи , для которых требовались настройки, которые я теперь могу предоставить.
Могу ли я просто позвонить снова builder.Build()
в конце моего обратного вызова, чтобы контейнер просто перестраивался без каких-либо проблем? Это кажется немного странным, потому что компоновщик уже собран (поэтому был выполнен обратный вызов).
Как лучше всего решить эту дилемму с помощью автофака?
ОБНОВЛЕНИЕ 1: Я читал, что такие вещи, как builder.Update (), теперь устарели, потому что контейнеры должны быть неизменяемыми. Что подтверждает мое подозрение, что сборка контейнера, добавление новых регистраций и сборка заново - не очень хорошая практика.
Другими словами, я могу понять, что использование обратного вызова для построения реестра не должно использоваться для регистрации дополнительных вещей. Но тогда остается вопрос: как бороться с этими проблемами?