2017-02-08 4 views
0

Примечание: Это похоже на этот QuestionAutoFac Resolve CommandHandlers от конкретных полученных услуг

Мой вопрос, если у меня есть интерфейсы, определенные как показано ниже:
(Примечание: Мой код имеет более чем один производный уровень, например, для простота)

public interface IHandler 
{ 
    void Handle(IBaseCommand command); 
} 

public interface IHandler<out T> : IHandler where T : IBaseCommand { } 

public interface IBaseCommand { } 
public interface IDerivedCommand : IBaseCommand { } 
public class BaseCommand : IBaseCommand { } 
public class DerivedCommand : IDerivedCommand { } 

public class BaseCommandHandler : IHandler<IBaseCommand> 
{ 
    public void Handle(IBaseCommand command) { } 
} 

public class DerivedCommandHandler : IHandler<IDerivedCommand> 
{ 
    public void Handle(IBaseCommand command) { } 
    public void Handle(IDerivedCommand command) { } 
} 

Мой фрагмент регистраций для этого примера выглядит следующим образом:

builder.RegisterType<DerivedCommand>().AsImplementedInterfaces(); 
builder.RegisterType<BaseCommand>().AsImplementedInterfaces(); 
builder.RegisterType<DerivedCommandHandler>().AsImplementedInterfaces(); 
builder.RegisterType<BaseCommandHandler>().AsImplementedInterfaces(); 

Этот container.Resolve<IEnumerable<IHandler<IBaseCommand>>>(); возвращает только BaseCommandHandler.

Мне нужно получить BaseCommandHandler и все производные типы, которые в этом случае будут включать DerivedCommandHandler.

Я понимаю, что эта регистрация container.Resolve<IEnumerable<IHandler>>(); разрешит обработчикам ВСЕХ, но мне нужно уметь разрешать любые случаи в производной цепочке.

ВОПРОС: Как разрешить все обработчики, начиная с определенного производного?

+0

Почему вам нужно Resolvr все обработчики? Вы хотите выполнить все из них? И если да, то почему одна команда имеет несколько обработчиков? Это было бы странно. Или вы просто хотите отправить команду incomming одному конкретному обработчику и собираетесь ли вы перебирать список, чтобы получить конкретный обработчик? – Steven

+0

Извинения. Я переработал именовал и забыл обновить имена классов/интерфейсов. Отредактировано для отражения выше. 1 команда для 1 обработчика. Я хочу отправить на основе разрешенного типа, поэтому мне не нужно разрешать все. Например, если я разрешаю IHandler , он возвращает все обработчики ISOMECommand и любые обработчики, которые имеют команды других интерфейсов, полученных из ISomeCommand. – xfitr2

+0

Если я держу его в коварианте, я нашел это, но мне нужно знать все регистрации заранее, которые, я думаю, я могу понять через размышления. 'builder.RegisterType () Как >(). >();' – xfitr2

ответ

0

Вы chould изменить:

IHandler<out T> 

к:

IHandler<in T> 
+0

Это правда. Это поможет мне получить все обработчики из производного типа? – xfitr2

+0

Вы пробовали? Я считаю, что Autofac имеет какую-то поддержку для отклонения. – Steven

+0

Я сделал, но получил те же результаты. До сих пор мое решение состояло в том, чтобы вызвать не-общий обработчик, который разрешает все из них, а затем использовать операторы if. 'if (handler is IHandler )' 'else if (обработчик IHandler )' – xfitr2

Смежные вопросы