2012-04-20 6 views
18

저는 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>>() 
+0

어떤 메시지를 할 필요가, 당신의 콘크리트 저장소 당신이 결합 할 일반적인 하나의 인스턴스를 밤은 있다고한다하여 예 말하고 당신입니다 점점? 그것은 하나 또는 런타임 컴파일입니까? 'ConcreteRepository '는'IRepository '을 구현합니다 (일반적으로'IRepository '에 ctor 의존성이 있습니다.) 위의 경우 당신의 Bind가 잘못 될 것입니다 .. –

+0

@RubenBartelink 위의 업데이트를 참조하십시오. 귀하의 첫 번째 요점은 -하지만 그것은 ConcreteRepository IRepository 을 구현하는 언급했다. 아마도 두 번째 문제입니다. 내가 IRepository 생성자에서 유연성을 허용하려면 - 저장소 종속성을 처리해야합니다 콘크리트 엔티티가 아닌 인터페이스. – McGarnagle

+0

오른쪽.컴파일 에러를 야기하는'where' 제약 조건은 이유가 있습니다 - 당신이 제안하고있는 구체적인 컴포넌트 타입이 당신이'Bind'하는 서비스 타입으로 변환 될 수있는 방법이 없습니다 찾고 그만! 다른 사람들이 일반적인 저장소 패턴을 어떻게 적용했는지 살펴 보는 것이 좋습니다. 일반적인 작업과는 거리가 멀습니다. 당신은 당신이 여기에서 당신의 질문에서이 물건들로부터 무엇을 얻었는지 설명 할 수 있습니다, 그러나 당신이 먼저 당신 자신에게 물어봐야한다고 제안 할 것입니다. 그리고 아마도 당신의 계급 계층 구조가 합리화 될 수 있을지 어떨지를 물어볼 것입니다. –

답변

31
kernel.Bind(typeof(IRepository<>)).To(typeof(SimpleRepository<>)); 

내 하나를 살펴 보자 : http://blog.staticvoid.co.nz/2011/10/staticvoid-repository-pattern-nuget.html 바인딩 예가 있습니다

EDIT :

당신이 점점 오류가이

public class ConcreteRepository<ConcreteEntity> : IRepository<IEntity>{} 

하지

public class ConcreteRepository<ConcreteEntity> : IRepository<ConcreteEntity>{} 
+0

+1하지만 왜 그렇게 작동하지 않을까요? 그의 케이스 –

+0

@RubenBartelink 흠, 내가 위의 시나리오가'IRepository '을'ConcreteRepository '에 바인딩하지만'ConcreteRepository '에 바인딩하지 않는다는 것이 문제라는 것입니다. Ninject의 모든 유형에 대해이 바인딩을 생성하는 방법입니다.이 효과를 얻으려면 각 저장소를 수동으로 바인드해야합니다. –

+0

혼란에 대한 사과 - 필자는 유스 케이스를 단순화하여 사용 사례를 단순화하려고 노력했지만, 내가하려는 일을 그냥 모호하게 만들었다 고 생각합니다. 기본적으로 당신이 제안하는 것을 구현했습니다. 클래스 정의에서 엔티티에 대한 인터페이스를 보존하기 위해 두 번째 유형 매개 변수 만 추가했습니다. – McGarnagle

관련 문제