2013-01-03 17 views
9

sto creando un nuovo progetto in ASP.net utilizzando MVC 4.migliori pratiche per l'iniezione di dipendenza

Voglio installare l'iniezione di dipendenza utilizzando Ninject. Ma prima di procedere, quali sono le migliori pratiche quando si imposta l'iniezione di dipendenza?

Attualmente ho una configurazione di classe raccoglitore all'interno del webproject che farà riferimento a progetti di dati all'interno della soluzione.

La classe legante è la seguente:

Public static class Binder 
{ 
    static Ninject.IKernel _kernel; 

    static Binder() 
    { 
     _kernel = new Ninject.StandardKernel(); 

     _kernel.Bind<IConfig>().To<AppSettingsConfig>(); 
     _kernel.Bind<IDocuments>().To<DocumentsClass.Documents>(); 

    } 

    public static T GetImplementation<T>() 
    { 
     return _kernel.Get<T>(); 
    } 

} 

Poi nel mio controller io uso il metodo GetImplementation di utilizzare la dipendenza richiede esatto, piuttosto che registrare tutto all'avvio dell'applicazione.

codice di esempio dal controllore:

Public ActionResult Get (int id) 
{ 
    var repository = Binder.GetImplementation<IDocuments>(); 

    // do some stuff with the repository here 
} 

Non so se questo sarebbe un buon approccio? Qualsiasi consiglio sarebbe buono.

+4

Un po 'di codice sarebbe bene così? – BenjaminPaul

+1

@Wiktors risposta di seguito è la strada da percorrere. Usa l'iniezione del costruttore il più possibile. Utilizzare l'anti-pattern SL solo se, per qualche motivo, non si è in grado di impostare una catena di dipendenze completa. –

risposta

16

Quello che hai ora è un esempio di anti-pattern del localizzatore di servizi. Google per ulteriori dettagli, come è stato discusso molte volte.

In breve, piuttosto che basarsi sul localizzatore di servizio

public class SomeController 
{ 
    public ActionResult Get (int id) 
    { 
     var repository = Binder.GetImplementation<IDocuments>(); 

     // do some stuff with the repository here 
    } 
} 

si dovrebbe avere il vostro servizio iniettato nella classe di client (si affidano a iniezione costruttore)

public class SomeController 
{ 
    private IDocuments documentService { get; set; }  

    public SomeController(IDocuments documentService) 
    { 
    this.documentService = documentService; 
    } 

    public ActionResult Get (int id) 
    { 
     var repository = documentService; 

     // do some stuff with the repository here 
    } 
} 

In questo caso specifico, è potrebbe configurare la tua fabbrica di controller per usare il tuo contenitore IoC per risolvere i tuoi controller.

0

L'utente è collegato all'istanza della classe Binder all'interno del controller. Rende la tua classe non riutilizzabile e deve essere refactored, perché non è la resposabilità del controller per ottenere l'istanza corretta di implementazione di IDocuments. Ci deve essere un risolutore di dipendenze esterno (come ad esempio - Ninject) che deve fare l'iniezione del costruttore o l'iniezione di proprietà.