2017-10-03 16 views
0

私はMediatr 3.0.1とstructureMap.Microsoft.DependencyInjection 1.4.0を持つasp.netコアWeb APIプロジェクトを持っています。メディエータpiplineビヘイビア登録

前処理と後処理の動作を使用したいと思います。 期待通りIPipelineBehaviorは動作しますが、thoese 2ない:

public class PostProcessingBehavior<TRequest, TResponse> : IRequestPostProcessor<TRequest, TResponse> 
{ 
    public Task Process(TRequest request, TResponse response) 
    { 
     LogTo.Info("Post processing: All Done"); 
     return Task.FromResult(0); 
    } 
} 

public class PreProcessingBehavior<TRequest>: IRequestPreProcessor<TRequest> 
{ 
    public Task Process(TRequest request) 
    { 
     // add validators here 
     LogTo.Info("Pipline preprocessing happens"); 

     return Task.FromResult(0); 
    } 
} 

コンテナ登録:

private IServiceProvider ConfigureIoC(IServiceCollection services) 
{ 
    var container = new Container(); 
    container.Configure(cfg => 
    { 
     cfg.Scan(scanner => 
     { 
      scanner.AssemblyContainingType(typeof(Startup)); 
      scanner.AssemblyContainingType(typeof(CustomerGetHandler)); 
      scanner.ConnectImplementationsToTypesClosing(typeof(IRequestHandler<>)); // Handlers with no response 
      scanner.ConnectImplementationsToTypesClosing(typeof(IRequestHandler<,>)); // Handlers with a response 
      scanner.ConnectImplementationsToTypesClosing(typeof(IAsyncRequestHandler<>)); // Async handlers with no response 
      scanner.ConnectImplementationsToTypesClosing(typeof(IAsyncRequestHandler<,>)); // Async Handlers with a response 
      scanner.ConnectImplementationsToTypesClosing(typeof(INotificationHandler<>)); 
      scanner.ConnectImplementationsToTypesClosing(typeof(IAsyncNotificationHandler<>)); 
      scanner.WithDefaultConventions(); 
     }); 

     cfg.For(typeof(IPipelineBehavior<,>)).Add(typeof(PreProcessingBehavior<>)); 
     cfg.For(typeof(IPipelineBehavior<,>)).Add(typeof(LoggingBehavior<,>)); 
     cfg.For(typeof(IPipelineBehavior<,>)).Add(typeof(PostProcessingBehavior<,>)); 

     cfg.For<SingleInstanceFactory>().Use<SingleInstanceFactory>(ctx => t => ctx.GetInstance(t)).ContainerScoped(); 
     cfg.For<MultiInstanceFactory>().Use<MultiInstanceFactory>(ctx => t => ctx.GetAllInstances(t)).ContainerScoped(); 
     cfg.For<IMediator>().Use<Mediator>(); 

     cfg.Populate(services); 
    }); 

    return container.GetInstance<IServiceProvider>(); 
} 

エラーは言う:
例外ArgumentOutOfRangeException:指定された引数が有効な値の範囲外でした。 パラメータ名:インスタンスがReturnType PostProcessingBehaviorと「PostProcessingBehavior」はIPipelineBehavior

にキャストすることはできません、これは例からです:あなたはあなたにリンクしている例を見てみると https://github.com/jbogard/MediatR/blob/master/samples/MediatR.Examples.StructureMap/Program.cs

答えて

1

は、インターフェイスを混同しているように見えます。

あなたは& IRequestPreProcessorないIPipelineBehaviorIRequestPostProcessorを実装しています。

だからあなたはあなたが実装しているインターフェイスに登録する必要があります。documentationを読むことから

cfg.For(typeof(IRequestPreProcessor<>)).Add(typeof(PreProcessingBehavior<>)); 
cfg.For(typeof(IRequestPostProcessor<,>)).Add(typeof(PostProcessingBehavior<,>)); 

を、あなたはまた、次の

cfg.For(typeof(IPipelineBehavior<,>)).Add(typeof(RequestPreProcessorBehavior<,>)); 
cfg.For(typeof(IPipelineBehavior<,>)).Add(typeof(RequestPostProcessorBehavior<,>)); 
+0

[OK]を登録する必要があるかもしれません私はここで完全に間違って何かを理解しました。それは今意味がある。ありがとう。あなたの最初のコードを追加しただけですが、プリプロセッサとポストプロセッサでは何も起こりません。 「プリプレスとポストプロセッサビヘイビアをIPplelineBehaviorとして登録する」という文章は、私がそれをどのように理解していたかではありません – Andre