2013-04-22 5 views
1

클래스에 대한 모든 종속성을 해결할 MainFactory를 만들었지 만 생성자 매개 변수를 자동으로 확인하기 위해 Ninject를 사용하고 싶습니다.Ninject가 ToMethod 바인딩을 해결합니다.

그래서, 나는 내가 ILoggerContainer에 따라 뭔가 바인딩있을 때, 난을 해결하기 위해 방법을 지정해야하므로

kernel.Bind<ILoggerContainer>().ToMethod(m => MainFactory.CreateLoggerContainer()); 

하지만, 같은 내 공장의 메소드에 대한 인터페이스를 결합하기 위해 노력하고있어 이 같은 다른 컨테이너

kernel.Bind<IUsersContainer>().ToMethod(m => MainFactory.CreateUsersServiceContainer(kernel.Get<ILoggerContainer>())); 

이제 Ninject의 주요 목표는 이러한 종속성을 자동으로 해결하는 것이므로 특히 더 나은 방법이라고 확신합니다.

편집 : MainFactory 종속성 변경, 난 단지 그 DLL을 업데이트해야하는 경우, 따라서 모든 종속성을 포함하는 별도의 프로젝트입니다.

내가 매개 변수로 인터페이스의 구현을 위해 생성자를 설정할 수 있도록 Ninject에 사용됩니다, 그것은

의 주요 문제는 내가이

kernel.Bind<IUsersContainer>().ToMethod(m => MainFactory.CreateUsersServiceContainer(kernel.Get<ILoggerContainer>())); 
을 어떻게 할 수 있었다, 자동으로 설정됩니다 이

kernel.Bind<IUsersContainer>().ToMethod(m => MainFactory.CreateUsersServiceContainer()); 

노트 같은에

는 CreateUsersServiceContainer의 매개 변수를 제거하고 나는 Ninject에이 t과의 매개 변수를 채울 수 있으리라 믿고있어 그는 적절한 가치 (이미 Ninject에 묶여 있음)

답변

0

나는 당신의 질문이 무엇인지는 모르겠지만 당신이하려고하는 것처럼 보이는 것은 MainFactory 클래스를 사용하여 다른 모든 클래스를 빌드하는 것뿐만 아니라 Ninject "두 번째 수준"종속성을 구축합니다.

내게있어서 이것은 매우 이상한 접근법처럼 보입니다. 최상위 오브젝트를 구성하기 위해 MainFactory을 사용해야하는 특별한 이유가 있습니까? 이것은 하나의 "하나님 객체"가 많은 일을하는 데 사용되는 디자인 문제를 나타냅니다. 또한 클래스가 새로운 의존성을 필요로 할 때마다 Ninject 바인딩과 MainFactory 메소드를 변경해야합니다. 어떤 종류의 클래스는 Dependency Injection 프레임 워크를 처음부터 사용하지 않습니다.

MainFactory을 적절한 Ninject 바인딩으로 대체 할 수 있습니까? 런타임시 Ninject 제공자/팩토리를 사용하여 오브젝트를 빌드 할 수 있습니까? 당신이 이것을 대체 할 수있는

public class MainFactory 
{ 
    public static IFoo CreateFoo(ILogger log) 
    { 
     return new Foo(log); 
    } 
} 

IFoo foo = MainFactory.CreateFoo(kernel.Get<ILogger>()); 

:

kernel.Bind<ILogger>().To<FileLogger>(); 
kernel.Bind<IFoo>().To<Foo>(); 
IFoo foo = kernel.Get<IFoo>(); 

매우 표준 Ninject에 접근 예를 들어, 경우 MainFactory는 다음과 같이했다. 런타임에 값을 제공해야하는 경우 다음과 같은 일을 수행 할 Ninject Factory Extension을 살펴 :

나는 새로운 의존성을 만들 때 변경해야 것에 대해 생각하지 않은
public class Foo 
{ 
    public Foo(string runtimeArg) { ... } 
} 

public interface FooFactory 
{ 
    IFoo CreateFoo(string runtimeArg); 
} 

kernel.Bind<IFoo>().To<Foo>(); 
kernel.Bind<IFooFactory>().ToFactory(); 
IFooFactory factory = kernel.Get<IFooFactory>(); 
IFoo foo = factory.CreateFoo("my runtime value"); 
+0

, 난 당신이 옳을 수도있을 것 같군요 MainFactory를 적절한 Bindings로 대체 할 때, 나는 필요하다면 AOP 데코레이터를 추가하기 위해 디자인을 열어두기를 원했다. – user579889

관련 문제