2015-01-09 3 views
4

Я использую Mediatr Джимми Богард и пытается использовать пример pipleine hereКак я могу украсить все мои привязок, реализующие определенный интерфейс в Ninject

моя проблема в том, что, хотя я могу получить все мои закрытия общего типа, как так

 kernel.Bind(
      x => 
       x.FromAssemblyContaining<ExpensiveRequest>() 
        .SelectAllClasses() 
        .InheritedFrom(typeof (IRequestHandler<,>)).BindAllInterfaces() 

Я не могу украсить их все с помощью MediatorPipeline.

Так что, если бы я использовал StructureMap я мог бы использовать что-то вроде этого

cfg.For(typeof(IRequestHandler<,>)).DecorateAllWith(typeof(MediatorPipeline<,>)); 

Я не могу найти, как я бы добиться этого с Ninject так, что, когда, когда мой Посредник называют его использует трубопровод Mediator, а затем до исходного обработчика

+2

. Соберите свой ответ самостоятельно? https://github.com/MrKevHunter/RedisMediatorClient – BatteryBackupUnit

+0

Вы когда-нибудь находили решение для этого? Я хочу знать, как это сделать для шаблона, такого как https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=91, где я хочу иметь возможность регистрировать один или несколько декораторов для моего 'ICommandHandler ' generics. – xan

+0

он находится в репозитории github выше –

ответ

1

Пара способов сделать это. Вы можете сделать на основе сканирования конвенции, которые вы уже делаете, и добавьте контекстуальную привязку к концу этого:

kernel.Bind(x => x.FromAssemblyContaining<ExpensiveRequest>() 
    .SelectAllClasses() 
    .InheritedFrom(typeof(IRequestHandler<,>)) 
    .BindAllInterfaces(); 
    .Configure(c => c.WhenInjectedExactlyInto(typeof(MediatorPipeline<,>)); 

Тогда просто сделать то же самое еще раз безWhenInjectedExactlyInto контекста фильтр:

kernel.Bind(x => x.FromAssemblyContaining<ExpensiveRequest>() 
    .SelectAllClasses() 
    .InheritedFrom(typeof(IRequestHandler<,>)) 
    .BindAllInterfaces(); 

Для этого потребуется выполнить два сборочных сканирования.

Другой способ - написать IBindingGenerator и выполнить несколько привязок там - один с WhenInjectedExactlyInto и другой без. Для этого тогда потребуется только одно соглашение на основе привязки с использованием синтаксиса .BindWith<MyBindingGenerator>() вместо .BindAllInterfaces()