2017-10-03 28 views
0

Mediatr 3.0.1 및 structureMap.Microsoft.DependencyInjection 1.4.0이 포함 된 asp.net 핵심 웹 API 프로젝트가 있습니다.Mediator 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

당신이 연결 한 예를 보면.

IRequestPostProcessor & IRequestPreProcessorIPipelineBehavior이 아닙니다.

그래서 당신이 인터페이스는 구현하고 있습니다에 등록해야합니다

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

documentation을 읽는에서, 당신은 내가 여기에 완전히 뭔가 잘못 이해 한 다음

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

확인을 등록해야합니다 . 그것은 지금 의미가 있습니다. 감사. 나는 첫 번째 코드를 잘라내었지만 그 전후 프로세서에서는 아무 것도 일어나지 않았다. "Preple 및 Post Processors Behavior를 IPplelineBehavior로 등록"하는 문장은 내가 그것을 어떻게 이해했는지가 아닙니다. – Andre