2013-01-16 2 views
1

I 세 프로젝트Ninject Bindings : 동일한 인터페이스가 다른 유형에 바인드되었습니다. 왜 효과가 있니?

  • Application.Infrastructure
  • Application.A있다 (Application.Infrastructure 갖는 행 참조)
  • Application.B
  • Application.Web (전체에서 참조가 (Application.Infrastructure에서 참조 갖는다))

Application.Infrastructure에는 일반 저장소 클래스

가 있습니다. Application.A에서
public interface IRepository<T> 
{ 
    T FirstOrDefault(Expression<Func<T, bool>> where); 
} 

제가

Application.Web에서
public class ApplicationBRepository<T> : IRepository<T> 
{ 
    private readonly IApplicationBDBContext _context; 
    public ApplicationBRepository(IApplicationBDBContext context) 
    { 
     _context = context; 
    } 
    // implementation 
} 

내가 Ninject에

을 이용하여 인터페이스를 결합 제가 저장소 인터페이스의 다른 구현을 Application.B 이것은 리포지토리

public class ApplicationARepository<T> : IRepository<T> 
{ 
    private readonly IApplicationADBContext _context; 
    public ApplicationARepository(IApplicationADBContext context) 
    { 
     _context = context; 
    } 
    // implementation 
} 

의 구현을

// Bind implementations from Application.A 
kernel.Bind<IApplicationADBContext>().To<ApplicationADBContext>().InRequestScope(); 
kernel.Bind(typeof(IRepository<>)).To(typeof(ApplicationARepository<>)); 

// Bind implementations from Application.B 
kernel.Bind<IApplicationBDBContext>().To<ApplicationBDBContext>().InRequestScope(); 

// Here should fail. I already binded typeof(IRepository<>) to typeof(ApplicationARepository<>) 
kernel.Bind(typeof(IRepository<>)).To(typeof(ApplicationBRepository<>)); 

.Where() 절을 지정하지 않고 동일한 인터페이스를 두 개의 다른 유형에 바인드하더라도 작동하고 오류가 발생하지 않습니다.

왜? Ninject가 어떻게 그들을 차별화하는지 알고 있습니까?

+0

을 코드의 어떤 라인 당신이 실패 할 것으로 예상합니까? 두 번째 바인딩 또는 라인 어디 인터페이스를 해결하려고합니까? –

+0

인터페이스가 다릅니다 .. 'BDB'와'ADB' ... –

+0

다른 인터페이스와 동일한 인터페이스를 바인딩 할 때 두 번째 바인딩 – Catalin

답변

0

단일 인터페이스에 여러 구현을 바인딩하는 것은 절대적으로 맞습니다. 그런 다음 Ninject에 IEnumerable으로 삽입하도록 할 수 있습니다. 하나의 구현을 여러 번 바인딩 할 수도 있습니다. 예를 들어

:

// binding 
kernel.Bind<IService>().To<BasicService>(); 
kernel.Bind<IService>().To<BasicService>(); 

// injection 
private IEnumerable<IService> myServices; 

public NeedServices(IEnumerable<IService> myServices) 
{ 
    this.myServices = myServices; 
} 

그리고 당신은 BasicService에 두 개의 참조의 컬렉션을 얻을 것이다.

오류가 발생하는 경우는 단일 구현을 삽입하려고하는 경우입니다. Ninject가 종속성을 해결하려고 시도 할 때 오류가 발생합니다 (그리고 어떤 구현을 선택 할지도 모름).

public NeedService(IService myService) 
{ 
    this.myService = myService; 
} 

그래서 해상도가 종속성 바인딩의 시간에 해결 될 수 있다면 Ninject에 확인하지 않는다는 것입니다,하지만 시간에 주입이 발생한다 때. Contextual-Binding 어떤 종류의 조건이 시간에 변경 될 수 있기 때문에

그리고 그것은 완벽하게 이해, (당신은 .When(x=> ItIsRightTimeToInjectAImplementation())를 예를 들어, 사용하는 경우.

관련 문제