2015-11-30 1 views
0

Я проверил образец в библиотеке Spring4d на управляемой событиями архитектуре.Spring4d Event Driven Architecture или Как получить все экземпляры данного интерфейса

Из того, что я могу понять, когда событие опубликовано, ServiceLocator создаст экземпляр всех классов, реализующих интерфейс IEventHandler<TEventClass>, и попросит обработчики обработать это событие.

Хотя, существует рекомендуемый подход, чтобы запрашивать уже созданные службы для обработки события.

Предположим, у меня есть произвольное количество Controllers, которые являются инстанцированными. Некоторые из них могут быть тем же классом, который создается несколько раз. Некоторые из них могут быть уникальными.

Я хочу, чтобы эти экземпляры Controllers прослушивали событие TUserAdded. Эти Controllers реализуют интерфейс IEventHandler<TUserAdded>. Я не хочу, чтобы не-экземпляр Controllers прослушивал событие.

В некотором смысле, я хотел бы получить список всех экземпляров, которые реализуют событие IEventHandler<TUserAdded>.

Кроме того, в идеальном случае, если Controller зарегистрирован как Singleton

container.RegisterType<TMySingletonController>.AsSingleton; 

Я хотел бы создать экземпляр TMySingletonController, если он уже не экземпляр, то пусть это обработать событие.

Есть ли встроенный подход в Spring4d, чтобы получить список всех экземпляров данного интерфейса?

+0

Несомненно, вы должны отслеживать их. –

ответ

1

Контейнер DI Spring4D является так называемым контейнером без слежения, что означает, что он не отслеживает время жизни создаваемых им экземпляров (за исключением однотонных, конечно).

Если вы хотите разрешить все зарегестированных для интерфейса X, то вы можете разрешить TArray<X> или IEnumerable<X>, но она будет создавать новые экземпляры, если они не зарегистрированы в качестве одноэлементных.

Образец, на который вы ссылались, был взят из статьи в блоге о объединении архитектуры DI и событий, но ваша проблема больше звучит так, как будто вы должны использовать наблюдатель и фабричные шаблоны. Просто, пожалуйста, не злоупотребляйте контейнером DI как хранилище экземпляров.