저는 Ninject를 처음 접했고 일반적인 저장소 패턴을 구현할 때 걸림돌이되었습니다. 나는 ConcreteRepository < T>는 IRepository < T를 구현>과 EntityType가 IEntityType를 구현하는 클래스 ConcreteRepository < EntityType>에 종속 IRepository < IEntityType>을 바인딩 할. 나는이 시도 :Ninject에서 일반 유형 인터페이스를 바인딩하는 방법
kernel.Bind<IRepository<IEntityType>>().To<ConcreteRepository<EntityType>>();
을 ...하지만 Ninject에 그것을 알거나 EntityType가 IEntityType를 구현하는 것을 신경 쓰지 않기 때문 적용되지 않습니다. 어떻게이 종속성을 바인딩 할 수 있습니까?
UPDATE
이 내가지고있어 오류입니다 :
오류 3 유형 'ICM.Dependency.Repository.ConcreteRepository'를 입력 매개 변수 'TImplementation'으로 사용할 수 없습니다 제네릭 형식 또는 메서드 'Ninject.Syntax.IBindingToSyntax.To()'. 'ConcreteRepository < EntityType>'에서 'IRepository < IEntityType>'까지의 암시 적 참조 변환은 없습니다.
솔루션
난 아직도 확실히 이해하지 못하는 이유를 내 바인딩이 작동하지 않습니다,하지만 분명히 내가 잘못이 제네릭을 사용하고 있었다. 이와 같은 솔루션은 실제로 NInject와 관련이 없습니다. 내가 명시 적으로 TEntityType와 IEntityType을 연결하는 ConcreteRepository를 지정 끝났다 :
public class ConcreteRepository<TInterface, TEntity> : IRepository<TInterface> where TEntity : TInterface { ... }
그런 다음 주입으로 기록 될 수있는 것은 다음과 같습니다 : 당신이 여기 원하는 경우
kernel.Bind<IRepository<IEntityType>>().To<ConcreteRepository<IEntityType,EntityType>>()
어떤 메시지를 할 필요가, 당신의 콘크리트 저장소 당신이 결합 할 일반적인 하나의 인스턴스를 밤은 있다고한다하여 예 말하고 당신입니다 점점? 그것은 하나 또는 런타임 컴파일입니까? 'ConcreteRepository'는'IRepository '을 구현합니다 (일반적으로'IRepository '에 ctor 의존성이 있습니다.) 위의 경우 당신의 Bind가 잘못 될 것입니다 .. –
@RubenBartelink 위의 업데이트를 참조하십시오. 귀하의 첫 번째 요점은 -하지만 그것은 ConcreteRepository IRepository 을 구현하는 언급했다. 아마도 두 번째 문제입니다. 내가 IRepository 생성자에서 유연성을 허용하려면 - 저장소 종속성을 처리해야합니다 콘크리트 엔티티가 아닌 인터페이스. –
McGarnagle
오른쪽.컴파일 에러를 야기하는'where' 제약 조건은 이유가 있습니다 - 당신이 제안하고있는 구체적인 컴포넌트 타입이 당신이'Bind'하는 서비스 타입으로 변환 될 수있는 방법이 없습니다 찾고 그만! 다른 사람들이 일반적인 저장소 패턴을 어떻게 적용했는지 살펴 보는 것이 좋습니다. 일반적인 작업과는 거리가 멀습니다. 당신은 당신이 여기에서 당신의 질문에서이 물건들로부터 무엇을 얻었는지 설명 할 수 있습니다, 그러나 당신이 먼저 당신 자신에게 물어봐야한다고 제안 할 것입니다. 그리고 아마도 당신의 계급 계층 구조가 합리화 될 수 있을지 어떨지를 물어볼 것입니다. –