2011-11-22 4 views
5

저는 Ninject (및 DI 일반적으로)를 처음 사용했습니다.ninject를 사용한 초기화 후 객체 생성

나는 어떻게 커널로드 모듈을 이해하고, 내가 지금까지 작성한 코드 한 줄을 가지고하는 경향이 :

내 모듈의 바인딩에서 필요한 모든 기능을 구성
myKernel.Get<MyApp>() 

. 새 인스턴스가 초기화 될 필요가있는 경우 초기화를 위해 바인드 한 팩토리가 이러한 인스턴스를 처리합니다. 지금까지, 공장은 요구에 따라 객체를 새로 만드는 것만으로, 어떤 객체 지향 의존성도 없었습니다.

이제는 초기화 후 객체 생성에 대해 생각해 봐야하고 내 공장 패턴이 더 이상 절단하지 않는다는 점에 도달했습니다. 이것은 (원격) 클라이언트를위한 pub/sub 인터페이스를 지원하는 것입니다. 서버에 연결할 때마다 ninject 모듈에 정의 된 바인딩 집합에 따라 새로운 IClient 인스턴스를 만들고 싶습니다. 이것은 초기화시에 전달되는 팩토리가 자체 커널 (또는 메인 커널에 대한 참조)을 가져야 함을 의미합니까? 어디에서 CommonServiceLocator 기능을 사용합니까? CSL이 필요합니까?

막 다른 길을 막을 때까지 다른 사람들이이 문제에 어떻게 접근 할 수 있는지 여기에서 물어 보는 것이 가장 좋습니다.

답변

5

는 팩토리 인터페이스를 만들기를

public interface IClientFactory 
{ 
    IClient CreateClient(); 
} 

Ninject 2.3에 대해서는 https://github.com/ninject/ninject.extensions.factory을 참조하고 Ninject에 의해 다음 구성.

Bind<IClientFactory>().ToFactory(); 

2.2의 경우 직접 구현하십시오. 이 구현은 컨테이너 구성의 일부이며 구현의 일부가 아닙니다.

public class ClientFactory: IClientFactory 
{ 
    private IKernel kernel; 
    public ClientFactory(IKernel kernel) 
    { 
     this.kernel = kernel; 
    } 

    public IClient CreateClient() 
    { 
     return this.kernel.Get<IClient>(); 
    } 
} 
+0

감사합니다. Remo. 따라서 2.3에서 팩토리 인터페이스의 구체적인 구현을 만드는 것에 대해 걱정할 필요가 없습니다. 실제 구현은'ToFactory()'호출을 사용하여 바인드 될 때 어떤 방법 으로든 시작됩니다. – spender

+0

예 동적 프록시를 사용하여 자동으로 구현 됨 –

+0

니스. 당신의 도움을 주셔서 감사합니다. 그것은 내 머리 속에 많은 질문을 해결합니다. – spender

1

그것은 나의 요구 사항을 만족시킬 수있는 공장에 대한 다음 패턴과 같습니다 : 나는 형태의 생성자가

Bind<Func<IClient>>().ToMethod(ctx =>() => ctx.Kernel.Get<ClientImpl>()); 

:

SomeCtor(Func<IClient> clientFactory, blah...)