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)
}
Другие вопросы по тегам