2016-07-22 16 views
2

Ich bin mit Burg Windsor für Dependance-Injektion und versuchen, einige generische Typen zu injizieren. Wenn ich jedoch auf meinem Container auflösen, erhalte ich die folgende Fehlermeldung:Castle windsor - Auto nicht generische Einschränkungen der Implementierung Typ

Die Klasse erfüllt nicht die allgemeinen Einschränkungen des Implementierungstyps.

Ich übergebe einen einfachen Car Typ im Moment in diesem Beispiel.

public class CreateRequestInstance<T> where T : class, ICreateRequestInstance<T> 
{ 
    private IRequestObject<T> _IRequestObject; 

    public CreateRequestInstance(IRequestObject<T> requestObject) 
    { 
     this._IRequestObject = requestObject; 
    } 

    public TReturn CreateRequest<TReturn>(string provider, string type, string token, T request, 
     string revision, string errorCode, string errorMessage) 
    { 
     _IRequestObject.Provider = provider; 
     _IRequestObject.Type = type; 
     _IRequestObject.Token = token; 
     _IRequestObject.Request = request; 
     _IRequestObject.ErrorCode = errorCode; 
     _IRequestObject.ErrorMessage = errorMessage; 

     return (TReturn)Convert.ChangeType(_IRequestObject, typeof(IRequestObject<T>)); 
    } 
} 

Das ist mein Installateur

public void Install(IWindsorContainer container, IConfigurationStore store) 
{ 
    container 
     .Register(Component 
      .For(typeof(ICreateRequestInstance<>)) 
      .ImplementedBy(typeof(CreateRequestInstance<>)) 
      .LifestyleTransient()) 
     .Register(Component 
      .For(typeof(ICreateResponseInstance<>)) 
      .ImplementedBy(typeof(CreateResponseInstance<>)) 
      .LifestyleTransient()) 
     .Register(Component 
      .For(typeof(IRequestObject<>)) 
      .ImplementedBy(typeof(RequestObject<>)) 
      .LifestyleTransient()) 
     .Register(Component 
      .For(typeof(IResponseObject<>)) 
      .ImplementedBy(typeof(ResponseObject<>)) 
      .LifestyleTransient()); 
} 

Dieser Aufruf

meiner Klasse Fabrik ist
public T GetConcreteClass<T>() 
{ 
    var someClass = container.Resolve<T>(); 
    return someClass; 
} 

und dies ist der aufrufende Code

var t = factory.GetConcreteClass<ICreateRequestInstance<ICar>>(); 

var test = t.CreateRequest<ICar>("provide", "test", "test", car, "1", "this is a test", "fred"); 

Jede Hilfe mit diesem wäre geschätzt

Antwort

4
public class CreateRequestInstance<T> where T : class, ICreateRequestInstance<T> 

Das sieht nicht richtig aus. Sie deklarieren eine Klasse, die einen Vorlagenparameter erwartet, bei dem es sich um eine Klasse handelt, die ICreateRequestInstance<T> implementiert. Mit diesem erhalten Sie den Fehler, den Sie sehen, es sei denn, Ihr Car Typ implementiert ICreateRequestInstance<T> (was ich bezweifle, dass es tut).

Ich glaube, Sie wirklich gedacht:

public class CreateRequestInstance<T> : ICreateRequestInstance<T> where T : class 

Dies ist eine Klasse, die ICreateRequestInstance<T> implementiert, die ein Template-Parameter erwartet, dass jede Klasse.

+0

danke. Ich habe den Schalter, den Sie vorgeschlagen haben, gemacht und die generische Einschränkung entfernt und es hat funktioniert – chrisblue13

Verwandte Themen