Ninject: создать экземпляр службы во время настройки
Я хочу настроить свой пустой контейнер, используя условные обозначения, и одновременно создавать экземпляры всех выбранных служб. Мое текущее решение:
var singletons = new List<Type>();
kernel.Bind(x =>
x.FromThisAssembly() // Scans currently assembly
.SelectAllClasses()
.WithAttribute<SingletonAttribute>()
.Where(type =>
{
var include = MySpecialFilterOfSomeSort(type);
if (include)
{
singletons.Add(type);
}
return include;
}) // Skip any non-conventional bindings
.BindDefaultInterfaces() // Binds the default interface to them
.Configure(c => c.InSingletonScope()) // Object lifetime is current request only
);
singletons.ForEach(s => kernel.Get(s));
БОЛЬШЕ
У меня есть внутрипроцессный сервисный автобус. Некоторые компоненты украшены [Singleton] и регистрируются в сервисной шине:
// the constructor
public FooEventsListenerComponent(IServiceBus serviceBus) {
serviceBus.Subscribe<FooEvent>(e => HandleFooEvent(e));
}
Мне нужно место в приложении, чтобы создавать экземпляры всех наблюдателей служебной шины. Делать это рядом с отображением типов удобно (но уместно ли это?), Потому что 1. типы уже перечислены, 2. у меня есть доступ к контейнеру DI.
1 ответ
В случае, если вы описываете, я думаю, что имеет смысл сделать явную регистрацию служебной шины. Чтобы расширить мой ответ на ваш другой вопрос о конвенциях:
Создайте интерфейс для слушателей:
public interface IServiceBusSubscriber
{
void SubscribeTo(IServiceBus serviceBus);
}
тогда вы можете адаптировать свое соглашение, чтобы связать все типы, которые наследуются от IServiceBusSubscriber
к их интерфейсу по умолчанию (тогда они должны быть названы как FooServiceBusSubscriber
а также BarServiceBusSubscriber
) или IServiceBusSubscriber
в явном виде.
После инициализации ядра со всеми привязками просто выполните:
IServiceBus serviceBus = kernel.Get<IServiceBus>();
foreach(IServiceBusSubscriber subscriber in kernel.GetAll<IServiceBusSubscriber>())
{
subscriber.SubscribeTo(serviceBus)
}