L'avere DI Happen nella Composition Root va contro il punto intero di Dependency Injection?

6

Uso Dependency Injection per un'applicazione web .NET MVC in cui ho tre livelli di base:

1) App Web 2) Livello di servizio 3) Livello dati

Inserisco il livello dati nel livello di servizio e il livello di servizio in un controller nella mia app Web, ma va tutto bene, ma sono confuso su dove avviene la registrazione di queste classi.

Dopo la ricerca mi è stato detto che la root di composizione è all'interno dell'applicazione web specificatamente nel file Global.asax che ho nel mio progetto, ma questo significa che ora ho un riferimento al livello dati all'interno dell'applicazione web per poterlo registrare. Questo sembra andare contro esattamente ciò che DI è per me dato che non voglio che la mia app web conosca o si preoccupi del livello dati solo il livello di servizio dovrebbe avere un riferimento?

    
posta Simon Nicholls 20.10.2015 - 17:53
fonte

1 risposta

10

Does Having DI Happen in the Composition Root go against the whole point of Dependency Injection?

No. Dovresti creare il grafico dell'oggetto nel Root di composizione .

Penso di capire la ragione della tua confusione. E penso che sia legato ai progetti ASP.NET. Per spiegare questo, lasciatemi dare un primo esempio che non riguarda ASP.NET.

Supponiamo di avere un'applicazione console. Abbiamo creato alcune librerie di classi che contengono tutti i pezzi di logica necessari per la nostra applicazione.

Diciamo che abbiamo creato le seguenti librerie di classi:

  1. ApplicationLibrary contiene classi correlate all'applicazione stessa. Potrebbe contenere anche qualche logica UI.
  2. BusinessLogicLibrary contiene classi correlate alla business logic.
  3. DataAccessLibrary contiene classi correlate all'accesso ai dati.

In questo caso ApplicationLibrary non ha un riferimento a DataAccessLibrary.

E poi componiamo questi pezzi insieme nel progetto Applicazione Console. Questo progetto in questo caso non contiene nulla tranne la composizione root.

La cosa con i progetti ASP.NET è che per impostazione predefinita si ottiene un modello in cui la radice di composizione e alcune logiche di Applicazione / UI si trovano nello stesso progetto.

Sarebbe bello avere un progetto web ASP.NET che contenga solo la radice della composizione (implementazione IControllerFactory per esempio). Quindi sposta i nostri controller e viste in un'altra libreria di classi che non ha un riferimento a DataAccessLayer poiché non è più la radice della composizione.

Potresti riuscire a farlo anche con ASP.NET. Non sono sicuro che ci sia un modo semplice però.

    
risposta data 26.10.2015 - 15:19
fonte

Leggi altre domande sui tag