그래서 내가 쓰고있는 응용 프로그램에서 MEF와 Ninject의 조합을 사용하려고 시도하고 있습니다. 기본적으로 런타임 중에 MEF를 통해 확장 기능을 추가합니다. 어떻게 런타임에 Ninject의 바인딩을 업데이트 할 수 있는지 이해할 수 없습니다.런타임 중에 Ninject의 DI를 사용하여 새로운 바인딩을 어떻게 동적으로 추가합니까?
[Export(typeof(ICar))]
public class BmwCar : ICar
{
private ICarLogger _carLogger;
public BmwCar(ICarLogger carLogger)
{
_carLogger = carLogger;
}
public static string Type
{
get { return "Sedan"; }
}
public string GetBrand()
{
return "BMW";
}
public static Type InterfaceType { get { return ICar; } }
public static Type CarType { get { return GetType(); } }
}
을 이제 정상적으로 난 그냥 같이 다음과 같은 바인딩으로 Ninject에 모듈을 만들 수 컴파일시에이 항목을 알고있는 경우 :
예를 들어 , 나는 다음과 같은 항목은 MEF에서 가져온 말 내가 COU 방법을 잘 모르겠어요Bind<ICarLogger>().ToMethod(x => x.Kernel.Get<CarLogFactory>(new ConstructorArgument("vehicleName", BmwCar.Type)).WhenInjectedInto<BmwCar>();
:
public class NinjectSetup : NinjectModule
{
public override void Load()
{
Bind<CarLogFactory>().ToSelf().InSingletonScope();
Bind<ICarLogger>().ToMethod(x => x.Kernel.Get<CarLogFactory>(new ConstructorArgument("vehicleName", BmwCar.Type)).WhenInjectedInto<BmwCar>();
}
}
그래서 문제는이 라인 BmwCar를 가져온 후에 동적으로 그런 것을 추가하십시오. 컴파일 타임 중에 타입이 필요하기 때문에 런타임시 제네릭을 사용할 수없는 것은 분명합니다. 실행 시간에 제네릭을 사용할 수 없기 때문에 다음과 같이 작동합니다.
var binding = new BindingBuilder<ICarLogger>(new Binding(typeof(ICarLogger)), this.Kernel).ToMethod(x => x.Kernel.Get<CarLogFactory>(new ConstructorArgument("vehicleName", imported.Type)).WhenInjectedInto<imported.CarType>();
은 옵션이 아닙니다. 누구든지 런타임 중에 새로운 바인딩을 만들 수 있다는 것을 알고 있습니까?
제네릭 매개 변수를 사용할 필요가 없습니다. To 메서드에는 정상 매개 변수로 Type을 받아들이는 오버로드가 있습니다. 내 대답을 참조하십시오. – cbp
'return ICar; 대신'return typeof (ICar);를 사용 했습니까? – Steven