2016-09-09 1 views
1

Ich versuche LightInject und MediatR zu verwenden, um generische Anforderungshandler zu erstellen. Grundsätzlich habe ich Typen wie folgt aus:LightInject löst geerbte generische Typen nicht

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

Und ich habe meine Handler Typ in mein LightInject Container registriert wie so:

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

Allerdings, wenn ich versuchen, und rufen Sie in meinem Vermittler für eine Implementierung von IAsyncRequestHandler<InheritedType,SomeResponseType>, schlägt es fehl. Ich hätte erwartet, meine registrierte Handler seit InheritedType Utensilien SomeType zu bekommen.

Mache ich hier etwas falsch oder gibt es einen Weg in LightInject, um das oben beschriebene Verhalten zu erreichen?


Lassen Sie mich wissen, wenn es nicht klar ist, und ich kann versuchen, mehr Informationen zur Verfügung zu stellen. Vielen Dank!

Antwort

2

Die Handler-Klasse schließt beide generischen Argumente und kann später nicht mehr geändert werden. Versuchen Sie manuell, eine neue Instanz der Handler-Klasse zu erstellen, und Sie werden feststellen, dass die generischen Argumente nicht angegeben werden können, weil sie geschlossen sind.

Ändern Sie Ihren Code zu diesem.

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

Register und lösen wie diese

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

ich aroudn es eine andere Art und Weise am Ende arbeiten, um die zusätzliche Schicht von Generika, aber gute Informationen zu vermeiden wissen, danke! Und danke für die tolle Bibliothek! – agc93