내 응용 프로그램에서 다른 데이터 소스를 이름으로 등록 할 수 있습니다. 이 데이터 소스에는 각각 약간의 string
속성이 필요하며 다른 종속성 세트도 있지만 그 외의 경우에는 동일하므로 몇 가지 다른 표준 구현을 사용하십시오.Ninject Providers : 종속성을 해결하는 올바른 방법은 무엇입니까
요청시 각 데이터 소스의 인스턴스를 생성하려면 해당 데이터 소스에 액세스하는 데 필요한 정보로 초기화되는 Provider<T>
의 인스턴스에 대한 바인딩을 만듭니다.
public class StandardListProvider<T> : Provider<IListExecutor<T>>
where T : new()
{
public string Name { get; set; }
public string ListMethod { get; set; }
public StandardListProvider(string name, string listMethod)
{
Name = name;
ListMethod = listMethod;
}
protected override IListExecutor<T> CreateInstance(IContext context)
{
var connector = (IInternalConnector)context.Kernel.GetService(typeof(IInternalConnector));
return new StandardListExecutor<T>(connector, Name)
{
ListMethodName = ListMethod
};
}
}
문제는 IInternalConnector
같은 StandardListExecutor<T>
의 의존성을 해결 함께 : 공급자는 다음과 같이 보입니다. 분명히 수동으로 생성 할 수도 있고 context.Kernel
에서 요청할 수도 있습니다 (예 : Ninject Providers -> Get another dependency inside the provider). 대상 정보가없는 요청이 발생합니다. 종속성에 대한 컨텍스트 바인딩을 수행하려는 경우에는 이상적이지 않습니다. StandardListExecutor
입니다.
context.Request.CreateChild(...)
으로 시도해 보았지만 활성화 할 때마다 ParameterTarget
을 생성해야합니다. 이것에 관한 많은 정보가 Ninject 문서에도 나타나지 않습니다.
내 질문은 : 기존 바인딩의 활성화 프로세스 내에서 의존성 또는 이와 같은 기타 서비스를 해결하는 정확한 방법은 무엇입니까?
편집
자체가 System.Web.Mvc 컨트롤러 활성화 과정에 Ninject.Mvc의 만남을 통해 만들어진 요청이.
질문에서 빠진 것은 제공된 오브젝트가 실제로 "요청"되는 방법입니다. 그러므로 나는 여기에 공급자가 필요 없다고 정말로 본다. 왜 대신 바인딩을 만드시겠습니까? 바인딩에 생성자 인수를 추가 할 수 있습니다. 각 실행기에 대해'FooParameters' 또는'FooSettings' 타입을 만드는 것이 더 나은 방법 일 것입니다. – BatteryBackupUnit
안녕하세요 @BatteryBackupUnit - 실제 요청은 Ninject.Mvc를 통해 컨트롤러 활성화 프로세스에 연결됩니다. 이 모든 것을 정직하게 처리 할 바인딩을 만드는 아이디어는 나에게는 발생하지 않았으며, 각기 다른 종류의 집행자를위한 설정 개체도 생성하지 않았습니다. 바인딩 자체가 'IMissingBindingResolver'에 의해 만들어지기 때문에 바인딩의 가능한 많은 활성화 로직을 ** 얻으려고했습니다. 어쨌든 나의 질문의 고기는 커스텀'제공자'를 만드는 최선의 방법이다. 왜냐하면이 질문은 나에게 몇 가지 다른 프로젝트에서 나왔기 때문이다. – s3raph86