CastleWindsor, регистрирующий все классы в сборке из общего интерфейса - PullRequest
0 голосов
/ 01 октября 2018

У меня есть следующий сценарий вложенного класса и интерфейсов:

internal class ComplaintDeletedAuditSubscriber : BaseDeletedEventAuditHandler<Complaint, DeletedEvent>
{
...
}

internal abstract class BaseDeletedEventAuditHandler<TEntity, TEvent> : BaseEventAuditHandler<TEntity, TEvent>{
...
}

internal abstract class BaseEventAuditHandler<TEntity, TEvent> : EventNatsSubscriberBase<TEvent>
{
...
}

internal abstract class EventNatsSubscriberBase<T> : INatsSubscriber where T : BaseEvent
{
...
}

Я пытаюсь добиться регистрации в моем контейнере IoC всех классов (подписчиков), которые реализуют INatsSubscriber .Как вы можете видеть INatsSubscriber является основным корнем, а некоторые уровни ниже, на самом деле на последнем уровне, вы можете найти ComplaintDeletedAuditSubscriber , который я в основном хочу зарегистрировать .. и аналогичномного других похожих подписчиков.Я попытался сделать следующее:

Classes.FromThisAssembly()
     .BasedOn<INatsSubscriber>()
     .WithService.FromInterface()
     .LifestyleSingleton(),

и, конечно, несколько других попыток ... но никто из моих подписчиков не получил инъекцию.Как правильно извлечь из сборки классы, которые реализуют INatsSubscriber ?заранее спасибо!

Редактировать: забыл упомянуть, что я хотел бы добавить все эти классы как IEnumerable .., чтобы привести пример:

public QueueListener(IEnumerable<INatsSubscriber> subscribers)
    {
        _subscribers = subscribers;
    }

в данном случае подписчиков должны быть все те классы, зарегистрированные в контейнере IoC, которые влияют на INatsSubscriber

1 Ответ

0 голосов
/ 03 октября 2018

Вам нужно WithServiceBase() вместо FromInterface().

В документации есть хороший обзор того, что делает каждый параметр.

...