2017-06-26 2 views
0

Auparavant, nous avions la configuration de pipeline suivante travail à des fins auditloggingEnregistrement d'un PostProcessor en utilisant ASP.NET base contrainte pipeline MediatR DI

public class AuditLogPostProcessor<TRequest, TResponse> : 
      IRequestPostProcessor<TRequest, TResponse> 
       where TRequest : IAuditLogRequest<TResponse> 

Où IAuditLogRequest implémente IRequest

public interface IAuditLogRequest<TResponse> : IRequest<TResponse> 

tous et que les commandes implémente l'IAuditLogRequest a atteint le AuditLogPostProcessor.

enregistrement à l'aide SimpleInjector se résume comme suit

_container.RegisterCollection(typeof(IRequestPostProcessor<,>), 
    new[] { typeof(GenericRequestPostProcessor<,>),typeof(AuditLogPostProcessor<,>) }); 

Actuellement, nous utilisons le ASP.NET de base DI pour notre injection de dépendance à l'enregistrement suivant.

services.AddScoped(typeof(IRequestPostProcessor<,>), typeof(GenericRequestPostProcessor<,>)); 
services.AddScoped(typeof(IRequestPostProcessor<,>), typeof(AuditLogPostProcessor<,>)); 

Lorsqu'une commande met en œuvre le IRequest, nous obtenons l'erreur

TypeLoadException: GenericArguments[0], 'Command', 
on 'AuditLogPostProcessor`2[TRequest,TResponse]' violates 
the constraint of type parameter 'TRequest'. 

Il semble que le DI ne respecte pas la contrainte. Puis-je obtenir le comportement souhaité avec ASP.NET Core DI?

Répondre

0

que je cherchais à faire exactement la même chose. Apparemment ASP.net core DI ne supporte pas cette fonctionnalité.

SRC: Support constrained open generic types

Vous devez utiliser un autre récipient tel que Autofac ou StructureMap. Exemple: Autofac for ASP.NET core

Il est très simple et ne nécessite pas beaucoup de changements

0

Nous avons une configuration similaire.

Si votre gestionnaire implémente IRequestPostProcessor, tout ce que vous devez faire est d'ajouter ceci à votre DI:

services.AddTransient(typeof(IPipelineBehavior<,>), typeof(RequestPostProcessorBehavior<,>));