2017-03-24 4 views
1

J'utilise les nouvelles fonctionnalités de Mediatr 3 pour les comportements de pipeline. Le problème est, quand je les câble dans Mediatr, des exceptions (System.InvalidCastException) sont levées pour chaque appel .Send(). Les gestionnaires sont appelés bien, mais quand il est temps d'appeler les comportements de pipeline, cela échoue.J'essaie d'utiliser IPipelineBehavior avec ASP.NET Core - get System.InvalidCastException

Voici ma configuration:

services.AddScoped<SingleInstanceFactory>(p => t => p.GetRequiredService(t)); 
    services.AddScoped<MultiInstanceFactory>(p => t => GetRequiredServices(p,t)); 
    services.AddScoped(typeof(IPipelineBehavior<, >), typeof(AddSessionBehavior<, >)); 
    services.AddMediatR(); 

Et mon comportement:

public class AddSessionBehavior<TRequest, TResponse> : IPipelineBehavior<TRequest, TResponse> 
    { 
     IHttpContextAccessor Accessor; 
     public AddSessionBehavior(IHttpContextAccessor anAccessor) 
     { 
      this.Accessor = anAccessor; 
     } 
     public async Task<TResponse> Handle(TRequest request, RequestHandlerDelegate<TResponse> next) 
     { 

      var response = await next(); 
      return response; 

     } 
    } 

Quand j'envoie mon premier message par le médiateur, je reçois:

System.InvalidCastException occurred 
    HResult=0x80004002 
    Message=Object cannot be stored in an array of this type. 
    Source=<Cannot evaluate the exception source> 
    StackTrace: 
    at System.Array.InternalSetValue(Void* target, Object value) 
    at System.Array.SetValue(Object value, Int32[] indices) 
    at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitClosedIEnumerable(ClosedIEnumerableCallSite closedIEnumerableCallSite, ServiceProvider provider) 
    at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitTransient(TransientCallSite transientCallSite, ServiceProvider provider) 
    at Microsoft.Extensions.DependencyInjection.ServiceProvider.<>c__DisplayClass16_0.<RealizeService>b__0(ServiceProvider provider) 
    at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) 
    at MediatR.ServiceCollectionExtensions.GetRequiredServices(IServiceProvider provider, Type serviceType) 
    at MediatR.Internal.RequestHandlerImpl`2.GetPipeline(TRequest request, RequestHandlerDelegate`1 invokeHandler, MultiInstanceFactory factory) 
    at MediatR.Internal.RequestHandlerImpl`2.Handle(IRequest`1 request, CancellationToken cancellationToken, SingleInstanceFactory singleFactory, MultiInstanceFactory multiFactory) 
    at MediatR.Mediator.Send[TResponse](IRequest`1 request, CancellationToken cancellationToken) 
    at Merlin.Web.Controllers.CourseController.Add(CourseAddVM model) 

Si je commente la câblage pour mon comportement, mes gestionnaires sont appelés bien. Et le reste de l'application semble fonctionner.

Qu'ai-je fait de mal?

Répondre

0

Je l'ai compris.

Il s'avère que quelque part sur le chemin une classe interne avec le même nom que mon comportement a été créé dans un espace de noms différent dans mon application. Probablement le résultat d'une "définition de classe de génération".

La suppression de la classe générée a résolu le problème.