У меня есть более простой класс "ServiceHelper", который принимает два параметра в конструкторе:
public ServiceHelper(ILogger<ServiceHelper> log, string serviceName)
(Общую оболочку ILogger для NLog, которую Autofac предоставляет просто отлично, а имя службы - это имя службы Windows для управления, которую мне нужно предоставить во время выполнения.)
У меня возникают проблемы с тем, как создавать новые экземпляры этого класса во время выполнения, используя разные имена служб, используя Autofac. Что-то вроде этого не работает, конечно, так как мне нужно указать разные имена служб во время выполнения:
builder.RegisterType<ServiceHelper>().As<IServiceHelper>().WithParameter(new NamedParameter("serviceName", null)).InstancePerDependency();
Из того, что я прочитал, его плохая привычка пропускать контейнер и вызвать "Разрешить" вручную ( "Анти-шаблон" "Об авторе", о котором предупреждает AutoFac), или это так? Если бы я это сделал, я мог бы сделать
container.Resolve<ServiceHelper>(new NamedParameter("serviceName", "some service name"));
Но даже дойти до этого я не совсем уверен, как заставить Autofac вводить контейнер в классы, нужно просто зарегистрировать себя, как именно так? А затем, чтобы мои классы нуждались в IContainer в своих конструкторах? (Это в службе С# с использованием вставки конструктора)
builder.RegisterType<Container>().As<IContainer>().InstancePerDependency();
Я тоже читал о фабриках делегатов, но это не похоже на то, чтобы пропускать контейнер.
На самом деле большинство моих классов, которые потребляют ServiceHelper, просто нуждаются в 1 или 2 ServiceHelpers для определенных имен служб, поэтому его не так, как будто я делаю тысячи с неожиданными параметрами serviceName, это просто заставляет мою голову немного болеть.