2016-07-22 7 views
2

종속성 분사 및 일부 일반 유형 주입을 위해 성 윈저를 사용함. 그러나 컨테이너에서 해결을 호출하면 다음과 같은 오류가 발생합니다.캐슬 윈저 - 자동차가 구현 유형의 일반적인 제약 조건을 충족시키지 않음

클래스가 구현 유형의 일반 제약 조건을 만족하지 않습니다.

이 예에서는 현재 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 T GetConcreteClass<T>() 
{ 
    var someClass = container.Resolve<T>(); 
    return someClass; 
} 

내 설치

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

이며,이 호출 코드

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