5

私はジミー・ボガードの Mediatr を使用しており、ここでパイプラインの例を使用しようとしています

私の問題は、すべてのクロージングジェネリック型をそのように取得できることです

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

MediatorPipeline でそれらすべてを装飾することはできません。

したがって、StructureMap を使用している場合は、次のようなものを使用できます

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

Ninjectでそれを達成する方法が見つからないため、メディエーターが呼び出されたときにメディエーターパイプラインを使用してから元のハンドラーに至る

4

1 に答える 1

2

これを行うにはいくつかの方法があります。すでに行っている規則ベースのスキャンを実行し、その最後にコンテキスト バインディングを追加することができます。

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();

ただし、これには 2 回のアセンブリ スキャンが必要になります。

もう 1 つの方法は、IBindingGenerator を記述し、そこで複数のバインディングを実行するWhenInjectedExactlyIntoことです。.BindWith<MyBindingGenerator>()これにより、次の構文を使用する単一の規則ベースのバインディングのみが必要になります。.BindAllInterfaces()

于 2016-01-17T22:39:48.793 に答える