2016-07-22 2 views
2

Im использует виндзор замка для инъекций зависимостей и пытается ввести некоторые общие типы. Однако, когда я вызываю решение на моем контейнере, я получаю следующую ошибку:Замок Windsor - Автомобиль не удовлетворяет общим ограничениям типа реализации

Класс не удовлетворяет общим ограничениям типа реализации.

Я прохожу простой тип Car в данный момент в этом примере.

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>)); 
    } 
} 

Это мой инсталлятор

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()); 
} 

Это мой класс завод вызов

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

и это код, вызывающий

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

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

Любая помощь с этим было бы оценивается

ответ

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

Это не выглядит правильным. Вы объявляете класс, который ожидает параметр шаблона, который является классом, который реализует ICreateRequestInstance<T>. При этом вы получите ошибку, которую видите, если ваш тип Car не реализует ICreateRequestInstance<T> (что я сомневаюсь в этом).

Я думаю, что вы на самом деле предназначен:

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

Это класс, который реализует ICreateRequestInstance<T>, что ожидает параметр шаблона, который любой класс.

+0

спасибо. Я сделал переключатель, который вы предложили, и удалил общее ограничение, и это сработало – chrisblue13

Смежные вопросы