2016-09-09 2 views
1

J'essaie d'utiliser LightInject et MediatR pour créer des gestionnaires de requêtes génériques. Au fond, j'ai des types comme les suivants:LightInject ne résout pas les types génériques hérités

public class SomeType { } 
public class InheritedType : SomeType { } 
public class Handler : IAsyncRequestHandler<SomeType, SomeResponseType> { } 

Et je me suis inscrit mon type Handler dans mon conteneur LightInject comme ceci:

registry.RegisterAssembly(typeof(SomeType).Assembly, (s, type) => 
      !s.IsClass && type.IsAssignableToGenericType(typeof(IAsyncRequestHandler<,>) 
      ); 

Cependant, quand je tente de faire appel à mon médiateur pour un mise en œuvre de IAsyncRequestHandler<InheritedType,SomeResponseType>, il échoue. Je m'attendais à obtenir mon enregistré Handler puisque InheritedType implémente SomeType.

Est-ce que je fais quelque chose de mal ici, ou y a-t-il un moyen quelconque dans LightInject d'obtenir le comportement que j'ai décrit ci-dessus? Faites-moi savoir si ce n'est pas clair et je peux essayer et fournir plus d'informations. Merci!

Répondre

2

La classe Handler ferme les deux arguments génériques et ne peut plus être modifiée ultérieurement. Essayez simplement manuellement de créer une nouvelle instance de la classe Handler et vous verrez qu'il n'y a aucun moyen de spécifier les arguments génériques car ils sont fermés.

Changez votre code pour ceci.

public class Handler<T, SomeResponseType> : IAsyncRequestHandler<T, SomeResponseType> where T:IAsyncRequest<SomeResponseType> 
{ 
    public Task<SomeResponseType> Handle(T message) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Inscrivez-vous et résoudre comme celui-ci

var container = new ServiceContainer();    
container.Register(typeof(IAsyncRequestHandler<,>), typeof(Handler<,>)); 
var instance = container.GetInstance<IAsyncRequestHandler<InheritedType, SomeResponseType>>(); 
+0

Je fini par travailler aroudn une autre façon d'éviter la couche supplémentaire de génériques, mais bien d'info savoir, merci! Et merci pour la bibliothèque géniale! – agc93