2017-07-19 16 views
0

私は現在、asp.netコアアプリケーションの一部の大型コントローラを改良しています。これを行うために我々はMediatrを選択しました。現在、これらの大きなアクションをプロセッサー前/後のハンドラー&に分割しています。Mediatr - プロセッサ前/後処理

一部のコマンドでは、内部通知システム(node.jsサービス)を起動する必要があります。そのために、イベントサービスに通知するポストプロセッサを開発しました。しかし、私はをインターフェイスから継承しているコマンドに対してのみ "トリガ"したいと思います。つまり、Mediatrはすべてのプリ/ポストプロセッサーをロードしますが、コマンドタイプがジェネリック制約に一致するものだけをトリガーします。コマンドがINotifyCommandから継承されていない場合、このポストプロセッサがトリガされない

public class NotificationPostProcessor<TCommand, TResponse> : IRequestPostProcessor<TCommand, TResponse> 
     where TCommand : >>INotifyCommand<< 
     where TResponse : CommandResult 
{ 
    (...) 
} 

:最後に、それは次のようになります。

プリプロセッサと同じことが起こります。たとえば、特定のコマンドに余分なデータを追加するには、プリプロセッサが必要です。

現在、私がしているのは恐ろしいです。私は確かに良い方法があります。

public class NotificationPostProcessor<TCommand, TResponse> : IRequestPostProcessor<TCommand, TResponse> 
    where TCommand : IRequest<TResponse> 
    where TResponse : CommandResult 
{ 
    private readonly INotificationService _service; 

    public NotificationPostProcessor(INotificationService service) 
    { 
     _service = service; 
    } 

    public async Task Process(TCommand command, TResponse response) 
    { 
     var cmd = command as NotifyBaseCommand; 
     if (cmd != null && response.IsSuccess) 
      await _service.Notify(cmd.Event, command, response); 
    } 
} 

私は+ MediatR.Extensions.Microsoft.DependencyInjectionパッケージデフォルトのasp.netのコア依存性注入エンジンを使用していますので、私は直接ポスト&プリプロセッサを登録していませんよ。

// Pipeline engine used internally to simplify controllers 
    services.AddMediatR(); 
    // Registers behaviors 
    services.AddTransient(typeof(IPipelineBehavior<,>), typeof(Pipeline<,>)); 
    services.AddTransient(typeof(IPipelineBehavior<,>), typeof(AuditBehavior<,>)); 
    services.AddTransient(typeof(IPipelineBehavior<,>), typeof(RequestPreProcessorBehavior<,>)); 
    services.AddTransient(typeof(IPipelineBehavior<,>), typeof(ValidationBehavior<,>)); 
    services.AddTransient(typeof(IPipelineBehavior<,>), typeof(RequestPostProcessorBehavior<,>)); 
    // Registers command validator 
    services.AddTransient(typeof(IValidator<RegisterUserCommand>), typeof(RegisterUserCommandValidator)); 

私はここで少し失われています。どのように私はこのシステムを改善することができますか?

はどうやらASP.netコアDIがこの機能をサポートしていない、 セバスチャン

答えて

0

、ありがとうございました。

SRC:Support constrained open generic types

それはAutofacで働きました。 1行のコードを追加するだけでした。

var host = new WebHostBuilder() 
     .UseKestrel() 
     .ConfigureServices(services => services.AddAutofac()) 
     .UseContentRoot(Directory.GetCurrentDirectory()) 
     .UseIISIntegration() 
     .UseStartup<Startup>() 
     .UseApplicationInsights() 
     .Build();