Мое приложение имеет два класса команд FooCommand
и BarCommand
, где BarCommand
является подклассом FooCommand
.
class FooCommand
class BarCommand : FooCommand
У меня есть классы для выполнения этих команд.
class FooCommandHandler : ICommandHandler<FooCommand>
class BarCommandHandler : ICommandHandler<BarCommand>
Эти обработчики команд зарегистрированы в Autofac как ICommandHandler<>
services.
builder.RegisterType<FooCommandHandler>.As<ICommandHandler<FooCommand>>();
builder.RegisterType<BarCommandHandler>.As<ICommandHandler<BarCommand>>();
Затем, когда мне нужно выполнить команду, я разрешаю зарегистрированные обработчики, используя тип перечисления Autofac , который отлично работает.
var barCommandHandlers = container.Resolve<IEnumerable<ICommandHandler<FooCommand>>>()
// returns [ FooCommandHandler ]
Пока все хорошо. Но когда я разрешаю зарегистрированные обработчики для BarCommand
, Autofac совпадает с реализациями BarCommandHandler
и FooCommandHandler
, потому что BarCommand
происходит от FooCommand
.
var barCommandHandlers = container.Resolve<IEnumerable<ICommandHandler<BarCommand>>>()
// returns [ BarCommandHandler, FooCommandHandler ]
Это поведение не слишком неожиданно, но это не совсем то, что я хочу.
Есть ли способ разрешить IEnumerable<ICommandHandler<BarCommand>>
для предоставления только тех обработчиков, которые непосредственно реализуют интерфейс ICommandHandler<BarCommand>
, не включая также те, которые реализуют ICommandHandler<Base>
?