Я создаю удобный вспомогательный пакет DI, который бы добавлял простую однофункциональную регистрацию компонентов (в духе .AddEntityFramework()
-подобных методов), чтобы соответствовать моему основному пакету.
По сутипользователи библиотеки зарегистрируют один или несколько IService
(singleton) экземпляров, а затем вызовут мой метод RegisterServiceHelpers()
.
. Я хочу, чтобы метод регистрировал помощника для каждого IService
зарегистрированного пользователя,Пример метода (не работает)
public static void RegisterServiceHelpers(this ContainerBuilder self)
{
foreach (var service in self.Build().Resolve<IEnumerable<IService>>())
self.Register(c =>
new ServiceHelper(service)).SingleInstance();
}
Это невозможно, поскольку Autofac разрешает вызывать .Build()
только один раз.
Также я попытался использовать поддержку неявного списка, подобную этой
self.Register(c => c.Resolve<IEnumerable<MessageBusFactory>>()
.Select(factory =>
new RabbitMqHealthCheckHandler(
factory,
c.Resolve<ILogger<RabbitMqHealthCheckHandler>>())))
.SingleInstance()
.As<IEnumerable<IHealthCheckHandler>>();
Но это не работает, не говоря уже о неправильной области действия SingleInstance()