Domanda

Sono nuovo di contenitori del CIO, e mi sto iniziato con Ninject.

Che cosa fare se si desidera che il costruttore per avere parametri che non sono i servizi e non hanno bisogno di essere istanziato dal contenitore CIO?

Ad esempio:

public class Person
{
    private readonly string _name;
    private readonly IPersonRepository _repository;

    public Person(string name, IPersonRepository repository)
    {
        _name = name;
        _repository = repository;
    }

    ......
}

Immaginate che nome è un requisito della classe Person, quindi, al fine di garantire che una persona ha sempre un nome, è necessario che essa sia passata in al costruttore.

Come potremmo ottenere un'istanza di persona che utilizza Ninject? Il nome deve essere passato in da qualunque po 'di app è la creazione di una nuova persona, mentre il contenitore CIO deve passare nel IPersonRepository.

Mi rendo conto che il nome o il repository potrebbero essere iniettati usando una proprietà, invece, ma questo non sarebbe una soluzione pulita -. Stiamo perdendo un po 'della potenza semantica del linguaggio di programmazione

È stato utile?

Soluzione

La classe, come scritto sopra, non sarebbe un buon candidato per l'uso con un contenitore CIO. Si stia mescolando le preoccupazioni qui con l'entità Persona in possesso di uno stato (il nome) e l'esecuzione di una certa azione (qualunque sia il repository è utilizzato per). Se refactoring del codice in modo che l'entità persona viene recuperato o creato tramite una classe che prende un'implementazione del IPersonRepository tramite il costruttore, allora vi troverete in un punto in cui l'iniezione di dipendenza rende più senso.

Altri suggerimenti

Il suo stato più di un anno da quando ho fatto questa domanda, e so di più ora che ho fatto allora. La risposta di Kevin è corretto e le migliori pratiche, ma a volte è necessario lavorare con le classi precedenti e vogliono fare qualcosa di simile che ho nella mia interrogazione. Ecco come lo faccio con Ninject:

public class Person
{
    [Inject]
    public IPersonRepository PersonRepository { get; set; }

    private string _name;

    public Person(string name)
    {
         _name = name;
         StaticKernelContainer.Inject(this);
    }
}

Un'implementazione di StaticKernelContainer può essere trovato nel progetto le estensioni Web Ninject.

I rispettosamente in disaccordo con la risposta di Kevin McMahon sopra, e il motivo è che ho visto dipendenza Codice di iniezione che fa esattamente quello che vuoi ... solo con un diverso contenitore CIO. Vale a dire, è stato il Castello di Windsor, che è un altro contenitore CIO. Sarebbe permetterà di creare una sezione nel file di configurazione per dire quali valori di fornire per il nome (non ha molto senso di farlo per nome, ma se fosse una proprietà come "connectionString", si potrebbe fare un sacco di senso).

Quindi ... non è che quello che si sta cercando di fare non è una misura per l'iniezione di dipendenza in generale ... è solo che Ninject non sembra bene con esso (o forse Ninject può ospitare pure .. . non so tutte le sue caratteristiche meno utilizzate abbastanza bene per dire).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top