다음 코드를 고려하십시오.Ninject에서 인터페이스의 배열 삽입
public interface IFoo { }
public class Bar
{
public Bar(IFoo[] foos) { }
}
public class MyModule : NinjectModule
{
public override void Load()
{
Bind<IFoo[]>().ToConstant(new IFoo[0]);
// ToConstant() is just an example
}
}
public class Program
{
private static void Main(string[] args)
{
var kernel = new StandardKernel(new MyModule());
var bar = kernel.Get<Bar>();
}
}
프로그램을 실행하려고하면 다음 예외가 발생합니다. IFoo
일치하는 바인딩을 사용할 수 없으며, 유형 자기 바인딩되지 않습니다 활성화
오류가 발생했습니다.
요청의 생성자 파라미터 FOOS에 종속 IFoo의
활성화 경로 : 형 바
1) 바
2) 주입
어떻게해서 Ninject의 배열/바인드를 주입 할 수 있는가?
감사합니다.
편집 :
내 응용 프로그램은 타사 구성 요소에서 생성 한 데이터를 가져옵니다. 가져 오기 프로세스가 다른 종류의 필터 (예 : 다른 필터 인터페이스 구현)를 적용합니다. 필터링 규칙은 매우 자주 변경되지만 순수 구성 (및 마스터 필터)을 수행하기에는 너무 복잡합니다.
가능한 한 쉽게 추가/편집 필터를 만들고 싶습니다. 내가 가진 것은 모든 필터 구현이 들어있는 어셈블리입니다. 모든 필터 인터페이스를 (해당 필터 유형의 모든 구현 인스턴스를 제공하는) 다음 메소드에 바인딩하려고했습니다. 기본적으로 필터 클래스를 추가/제거 할 때 Ninject 모듈을 변경할 필요가 없습니다.
private IEnumerable<TInterface> GetInterfaceImplementations<TInterface>(IContext context)
{
return GetType().Assembly.GetTypes()
.Where(t => typeof (TInterface).IsAssignableFrom(t) && IsConcreteClass(t))
.Select(t => Kernel.Get(t)).Cast<TInterface>();
}
컨테이너 DI 메커니즘을 우회하는 측면에서 다소 죄책감을 느낍니다. 이것은 나쁜 습관입니까? 그런 일을하는 일반적인 관행이 있습니까?
해상도 : bsnote이 제안
나는 래퍼 클래스를 사용합니다.
자세한 내용은 답변을 선택했습니다. 감사합니다 (+1) to bsno 테도! –