汎用インターフェイスをデコレータでラップしようとしていますが、単に機能しません。他の質問から、これを行う唯一の方法はデコレータごとに明示的に行うことだと思われます。私の質問はそれが可能かどうかです特定のインターフェイスを実装するすべてのタイプを ninject の特定の Decorator でラップします。
コード:
static void BindMediatr(IKernel kernel) {
kernel.Components.Add < IBindingResolver, ContravariantBindingResolver > ();
kernel.Bind(scan => scan.FromAssemblyContaining < IMediator > ()
.SelectAllClasses()
.BindDefaultInterface());
kernel.Bind < SingleInstanceFactory > ().ToMethod(ctx => t => ctx.Kernel.Get(t));
kernel.Bind < MultiInstanceFactory > ().ToMethod(ctx => t => ctx.Kernel.GetAll(t));
kernel.Bind(
x => x.FromThisAssembly()
.SelectAllClasses()
.InheritedFromAny(typeof(IAsyncRequestHandler < , > ))
.BindAllInterfaces());
kernel.Bind(typeof(IAsyncRequestHandler < , > ))
.To(typeof(Decorater < , > ))
.WhenInjectedInto < ApiController > ();
}
public class Decorater < TRequest, TResponse >
: IAsyncRequestHandler < TRequest, TResponse >
where TRequest: IAsyncRequest < TResponse > {
IAsyncRequestHandler < TRequest,
TResponse > _decoratee;
public Decorater(IAsyncRequestHandler < TRequest, TResponse > decoratee) {
_decoratee = decoratee;
}
public Task < TResponse > Handle(TRequest message) {
// do something here
}
}