NInject를 사용하여 알려진 단일 고정 범위의 Foo 서비스 목록을 해결하려고합니다. 이 해결 방법은 FooProvider의 생성자에서 발생합니다. 문제는 각 Foo가이 공급자를 필요로한다는 것입니다.Ninject를 사용하여 서비스를 확인할 때 스택 오버플로가 발생했습니다.
public interface IFoo { }
public interface IFooProvider { }
public class Foo : IFoo
{
private readonly IFooProvider _provider;
public Foo(IFooProvider provider)
{
_provider = provider;
}
}
public class FooProvider : IFooProvider
{
private List<IFoo> _allFooServices;
public FooProvider(IKernel kernel)
{
_allFooServices = kernel.GetAll<IFoo>().ToList();
}
}
public class Program
{
private static void Main(string[] args)
{
var IoC = new StandardKernel();
IoC.Bind<IFoo>().To<Foo>().InSingletonScope();
IoC.Bind<IFooProvider>().To<FooProvider>().InSingletonScope();
var foo = IoC.Get<IFoo>();
}
}
논리적 순환 루프가 여기에 있으며 분명히 스택 오버플로로 인해 스택 오버플로가 표시됩니다. 그러나, 나는 싱글 톤에 바인딩 된 인터페이스를 가지고있다.
그것에 대해 생각해보십시오. 우리는 IFoo를 해결하려고 노력합니다. IFoo의 목록을 필요로하는 IFooProvider의 해결책이 필요합니다 ... 그러나 우리는 여전히 IFoo의 singleton을 해결하지 못했습니다.
어떻게이 문제를 해결할 수 있습니까?
[편집] 가능한 해결책; IFoo 서비스 인스턴스의 지연 버퍼링.
public FooProvider(IKernel kernel)
{
_kernel = kernel;
}
public IFoo Find(object context)
{
if (_allFooServices == null)
_allFooServices = _kernel.GetAll<IFoo>().ToList();
return _allFooServices.Where(...
[이유는?]
일반적인 생각 나는 그것이 안티 패턴으로 설명 보았 듯이, 서비스 로케이터 패턴을 방지하는 것입니다. 따라서 런타임 중에 종속성 인젝터를 통해 서비스를 해결하기보다는, 설치 중에 서비스 목록을 얻으려고합니다. 그러나이 문제는 서비스가 다른 서비스를 찾고자 할 때 위와 같은 문제가 있다는 것입니다.
왜 'Foo'는'FooProvider'의 인스턴스를 필요로합니까? 실제로'FooProvider'가'Foo'를 생성하는 팩토리라면 다른 방법으로도 쉽게 사용할 수 있습니까? –
모든 Foo가 서비스이므로 FooProvider는 주입 시간에 모든 Foo 서비스 목록을 얻으려고합니다. foo가 런타임 중에 다른 foo (컨텍스트에만 해당)를 찾아야 할 경우 런타임에 FooProvider에 요청할 수 있습니다. –
'FooProvider'는 다른 모든'Foo'에 의한 의존성 삽입을 통해 쉽게 해결되는 싱글 톤이 아니어야합니까? –