2011-11-22 5 views
5

Sono nuovo su Ninject (e DI in generale).Creazione oggetto postinizializzazione con ninject

capisco come i moduli del kernel carica, e il codice che ho scritto finora tende ad avere una sola riga:

myKernel.Get<MyApp>() 

che costruisce tutto quello che serve dalle rilegature nel mio modulo. Se c'è un requisito per le nuove istanze dopo l'inizializzazione, queste sono prese in considerazione dalle fabbriche che eseguo il bind per l'inizializzazione. Fino ad ora, le fabbriche erano libere da ogni dipendenza, semplicemente rinnovando gli oggetti su richiesta.

Ora ho raggiunto un punto che ho bisogno di pensare alla creazione dell'oggetto dopo l'inizializzazione e il mio modello di fabbrica non lo sta più tagliando. Ciò dovrebbe supportare un'interfaccia pub/sub per i client (remoti). Con ogni nuova connessione al mio server, vorrei creare nuove istanze IClient in base a una serie di collegamenti definiti in un modulo ninject. Questo significa che la factory che passo al momento dell'inizializzazione deve avere il proprio kernel (o un riferimento al kernel principale)? Dove sarebbe CommonServiceLocator in questo. È necessario CSL?

Prima di viaggiare troppo lontano, ho pensato che sarebbe meglio chiedere qui come altri potrebbero affrontare questo problema.

risposta

5

creare un'interfaccia fabbrica

public interface IClientFactory 
{ 
    IClient CreateClient(); 
} 

Per Ninject 2.3 vedi https://github.com/ninject/ninject.extensions.factory e lascia che sia implementato da Ninject aggiungendo il seguente configurazione.

Bind<IClientFactory>().ToFactory(); 

Per 2.2 eseguire personalmente l'implementazione. Questa implementazione fa parte della configurazione del contenitore e non fa parte delle implementazioni.

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

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

Grazie Remo. Quindi, se ho capito bene, in 2.3 non devi preoccuparti di creare un'implementazione concreta dell'interfaccia di fabbrica? L'implementazione effettiva viene emessa in qualche modo da ninject quando viene utilizzata una chiamata 'ToFactory()'? – spender

+0

Sì, è stato implementato automaticamente utilizzando il proxy dinamico –

+0

Nice. Grazie per l'aiuto. Risolve un sacco di domande nella mia testa. – spender

1

Sembra che il seguente schema per la fabbrica potrebbe soddisfare le mie esigenze:

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

dove ho costruttore del form:

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