Примечание: Это похоже на этот 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>>();
разрешит обработчикам ВСЕХ, но мне нужно уметь разрешать любые случаи в производной цепочке.
ВОПРОС: Как разрешить все обработчики, начиная с определенного производного?
Почему вам нужно Resolvr все обработчики? Вы хотите выполнить все из них? И если да, то почему одна команда имеет несколько обработчиков? Это было бы странно. Или вы просто хотите отправить команду incomming одному конкретному обработчику и собираетесь ли вы перебирать список, чтобы получить конкретный обработчик? – Steven
Извинения. Я переработал именовал и забыл обновить имена классов/интерфейсов. Отредактировано для отражения выше. 1 команда для 1 обработчика. Я хочу отправить на основе разрешенного типа, поэтому мне не нужно разрешать все. Например, если я разрешаю IHandler, он возвращает все обработчики ISOMECommand и любые обработчики, которые имеют команды других интерфейсов, полученных из ISomeCommand. –
xfitr2
Если я держу его в коварианте, я нашел это, но мне нужно знать все регистрации заранее, которые, я думаю, я могу понять через размышления. 'builder.RegisterType() Как >(). >();' –
xfitr2