2011-10-13 25 views
31

Come si inseriscono le dipendenze nel file global.asax.cs, ad esempio la classe MvcApplication?Come iniettare dipendenze nel file global.asax.cs

Dopo aver utilizzato il pattern di identificazione servizio (anti-) per l'iniezione dipendente, sto cercando di seguire i consigli delle best practice nella mia ultima applicazione MVC utilizzando un contenitore IOC (in particolare Unity.Mvc3 perché include un'implementazione del IDependencyResolver out of the box) e iniezione del costruttore.

Tutto sembra abbastanza semplice fino ad ora tranne un paio di problemi, uno dei quali è nel global.asax.cs (l'altro è per attributi personalizzati ma c'è una domanda su SO che lo copre).

I gestori di eventi HttpApplication nella classe MvcApplication quali:

Application_Start() 
Application_EndRequest(object sender, EventArgs e) 
Application_AcquireRequestState(object sender, EventArgs e) 

possono richiedere dipendenze esterne, ad esempio una dipendenza da un ILogService. Quindi, come faccio a iniettarli senza ricorrere al modello di localizzazione (anti-) di servizio ad es.

private static ILogService LogService 
{ 
    get 
    { 
     return DependencyResolver.Current.GetService<ILogService>(); 
    } 
} 

Qualsiasi aiuto/consiglio molto apprezzato!

+0

Ciao, domanda interessante! Perché non puoi iniettare dipendenze all'interno del tuo global.asax in OnApplicationStarted? Se l'applicazione non può essere avviata, ne sarai a conoscenza poiché nulla funzionerà ... –

risposta

31

La classe nel tuo global.asax.cs è il tuo Composition Root, quindi non puoi (e non dovresti) iniettarvi qualcosa dall'esterno.

Tuttavia, c'è una sola istanza della classe MvcApplication, quindi se avete bisogno di un servizio in uno dei suoi metodi, si può semplicemente dichiarare come un campo membro - per esempio:

public class MvcApplication : System.Web.HttpApplication 
{ 
    private readonly ILogService log; 

    public MvcApplication() 
    { 
     this.log = new MyLogService(); 
    } 

    protected void Application_Start() 
    { 
     // ... 

     this.log.Log("Application started"); 
    } 
} 
+5

+1 sul blog Composizione della radice. Grandi cose! –

+1

Grazie per la risposta rapida Marco. Come collaudi unitamente i metodi se non riesci a iniettare un'istanza derisa di, ad es. il ILogService? – magritte

+4

Io no. Una radice di composizione è un esempio di un oggetto umile (http://xunitpatterns.com/Humble%20Object.html). Se è necessario richiamare la logica complessa da esso, è possibile delegare a un'altra classe che * può * essere unità testata. –

Problemi correlati