Configurazione di DI in un'applicazione disaccoppiata

2

Sto leggendo Dependency Injection in .NET di Mark Seeman (ottima lettura fino ad ora) e qualcosa mi sfugge.

Se l'architettura dell'applicazione è come [DAL] => [BLL] <= [UI] , con il livello della logica di business privo di dipendenze su accesso ai dati e livelli dell'interfaccia utente (e entrambi dipendono dalla BLL) e se la radice di composizione si trova nel livello dell'interfaccia utente, quindi come dovremmo essere in grado di collegare l'interfaccia di un tipo nella BLL con un'implementazione presente nel DAL?

Mark Seeman fornisce un esempio tipico: la classe astratta ProductRepository vive nel BLL e nella classe SqlProductRepository nel DAL. Potrebbe sembrare una domanda sciocca, ma come si suppone che il layer UI sia in grado di legare ProductRepository a SqlProductRepository senza un riferimento al DAL?

I move all the Controllers and ViewModels from the User Interface Layer to the Presentation Model layer, leaving only the Views (the .aspx and .ascx files) and the COMPOSITION ROOT in the User Interface layer.

Il fatto è che sono sicuro che questo ragazzo sappia di cosa sta parlando, quindi quale parte mi è sfuggita?

Inoltre dove dovrei mettere la radice della composizione nel caso di un progetto di libreria di classi? All'inizio pensavo che il BLL sarebbe stato perfetto (dato [DAL] <= [BLL] => [UI] ), ma ora che ho rifatto il mio progetto per invertire letteralmente le dipendenze, non lo so più - avevo una BLL che sapeva sia del DAL e il livello dell'interfaccia utente che legava così tanto i tipi di questi strati era facile, ora nessuno più conosce nessuno, è come se non avessi mai una radice di composizione. Aiutami qui, mi sento come se mi mancasse una pietra miliare fondamentale ...

    
posta Mathieu Guindon 04.07.2013 - 22:13
fonte

1 risposta

2

Crea semplicemente un progetto Bootstrapper nel tuo livello di interfaccia utente. Questo è stato il legame tra le tue interfacce BLL e la tua implementazione concreta sarà definita.

Dai un'occhiata a questa risposta SO dove spiego tutto i passaggi per farlo funzionare.
È una domanda correlata all'architettura di Onion ma le cose sono quasi le stesse qui.

L'ultima cosa da ricordare è che se hai Internal di servizi che il tuo progetto Bootstrapper deve conoscere, modifica il file AssemblyInfo.cs del tuo progetto BLL e consenti a Bootstrapper di vedere i suoi tipi Interni come segue: [assembly: InternalsVisibleTo("Bootstrapper")]

    
risposta data 04.07.2013 - 23:28
fonte

Leggi altre domande sui tag