Я хочу настроить контейнер ninject с помощью условных обозначений И одновременно создавать экземпляры всех выбранных сервисов. Мое текущее решение: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));
MORE
У меня есть автобус службы внутри процесса. Некоторые компоненты украшены [Singleton] и зарегистрируют себя с сервисной шиной:
// the constructor
public FooEventsListenerComponent(IServiceBus serviceBus) {
serviceBus.Subscribe<FooEvent>(e => HandleFooEvent(e));
}
мне нужно место в приложении, чтобы создать экземпляры всех наблюдателей шинного сервисными. Выполнение этого рядом с сопоставлением типов удобно (но подходит ли оно?), Потому что 1. типы уже перечислены, 2. У меня есть доступ к контейнеру DI.
Почему нужно инициализировать их? Не должны ли они быть внедрены как часть [Корень композиции] (http://blog.ploeh.dk/2011/07/28/CompositionRoot/)? Если нет, разделяют ли они какую-либо общую логику, например, вам нужно сказать им «закрыть», когда приложение закрывается? Или «инициализировать» после создания экземпляра? ... – BatteryBackupUnit
@BatteryBackupUnit, честные вопросы. Я обновил вопрос. –