2011-11-22 11 views
5

Jestem nowy dla Ninject (i DI w ogóle).Tworzenie obiektu po inicjalizacji z ninject

rozumiem, w jaki sposób ładuje moduły jądra, a kod pisałem do tej pory wydaje się mieć jeden wiersz:

myKernel.Get<MyApp>() 

który konstruuje wszystko co potrzeba z wiązaniami w moim module. Jeśli istnieje zapotrzebowanie na nowe instancje po inicjalizacji, są one obsługiwane przez fabryki, które wiążę w celu zainicjowania. Do tej pory fabryki były wolne od wszelkich zależnych od ninja zależności, po prostu zmieniając obiekty na żądanie.

Teraz dotarłem do punktu, w którym muszę się zastanowić nad tworzeniem obiektów po inicjalizacji, a mój własny wzorzec fabryczny już go nie przycina. Byłoby to wsparcie dla interfejsu pub/sub dla (zdalnych) klientów. Przy każdym nowym połączeniu z moim serwerem chciałbym utworzyć nowe instancje IClient zgodnie z zestawem powiązań zdefiniowanym w module ninject. Czy to oznacza, że ​​fabryka, którą przekazuję przy inicjalizacji, musi mieć własne jądro (lub ref do głównego jądra)? Gdzie będzie funkcja CommonServiceLocator w tym. Czy CSL jest niezbędny?

Zanim przejdę za daleko w ślepy zaułek, pomyślałem, że najlepiej będzie zapytać tutaj o to, jak inni mogą podejść do tego problemu.

Odpowiedz

5

utworzyć interfejs fabrycznego

public interface IClientFactory 
{ 
    IClient CreateClient(); 
} 

Dla Ninject 2.3 zobacz https://github.com/ninject/ninject.extensions.factory i pozwól, aby był on implementowany przez Ninject, dodając następująca konfiguracja.

Bind<IClientFactory>().ToFactory(); 

Dla 2.2 wykonanie samodzielnie. Ta implementacja jest częścią konfiguracji kontenera, a nie częścią twoich implementacji.

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

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

Dzięki Remo. Więc jeśli dobrze rozumiem, w 2.3 nie musisz się martwić o stworzenie konkretnej implementacji interfejsu fabrycznego? Rzeczywista implementacja jest emitowana w jakiś sposób przez ninject, gdy jest związana za pomocą wywołania 'ToFactory()'? – spender

+0

Tak, zaimplementowane automatycznie przy użyciu dynamicznego proxy –

+0

Nice. Dzięki za pomoc. Oczyszcza mi wiele pytań w mojej głowie. – spender

1

Wygląda poniższego wzoru do fabryki może spełnić moje wymagania:

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

gdzie mam konstruktora w postaci:

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