Spring4d Event Driven Architecture или Как получить все экземпляры данного интерфейса
Я проверил образец в библиотеке Spring4d на архитектуре, управляемой событиями.
Из того, что я могу понять, когда событие публикуется, ServiceLocator
будет создавать экземпляры всех классов, которые реализуют IEventHandler<TEventClass>
интерфейс и попросить эти обработчики обработать событие.
Тем не менее, есть ли рекомендуемый подход, чтобы только запросить уже созданные службы для обработки события.
Допустим, у меня есть произвольное количество Controllers
которые воплощены. Некоторые из них могут быть одним и тем же классом, который создается несколько раз. Некоторые из них могут быть уникальными.
Я хочу, чтобы эти экземпляры Controllers
слушать TUserAdded
событие. Эти Controllers
реализовать IEventHandler<TUserAdded>
интерфейс. Я не хочу необъявленных Controllers
слушать событие.
В некотором смысле, я хотел бы получить список всех экземпляров, которые реализуют IEventHandler<TUserAdded>
событие.
Кроме того, в идеальном случае, если Controller
зарегистрирован как Singleton
container.RegisterType<TMySingletonController>.AsSingleton;
Я хотел бы создать экземпляр TMySingletonController
если он еще не создан, пусть он обрабатывает событие.
Есть ли в Spring4d встроенный подход для получения списка всех экземпляров данного интерфейса?
1 ответ
Контейнер DI в Spring4D - это так называемый не отслеживающий контейнер, который означает, что он не отслеживает время жизни созданных им экземпляров (за исключением одноэлементных, разумеется).
Если вы хотите разрешить все зарегистрированные сервисы для интерфейса X
тогда вы можете решить TArray<X>
или же IEnumerable<X>
но это создаст новые экземпляры, если они не зарегистрированы как singleton.
Пример, на который вы посмотрели, был взят из статьи в блоге о комбинировании DI и управляемой событиями архитектуры, но ваша проблема звучит так, как будто вам нужно использовать шаблоны наблюдателя и фабрики. Только, пожалуйста, не злоупотребляйте DI-контейнером как хранилищем экземпляров.