Ho esaminato le applicazioni più semplici come Nerddinner e ContactManager e anche quelle più complicate come Kigg. Capisco quelli più semplici e ora vorrei capire quelli più complessi.Portare il mio MVC al livello successivo: DI e Unità di lavoro
In genere le applicazioni più semplici dispongono di classi di repository e interfacce (il più vagamente accoppiabili che possono ottenere) su LINQtoSQL o Entity Framework. I repository vengono chiamati dai controller per eseguire le operazioni necessarie sui dati.
Un modello comune che vedo quando esamino le applicazioni più complesse come Kigg o Oxite è l'introduzione di (io sono solo di graffiare la superficie qui ma devo iniziare da qualche parte):
- CIO DI (in Kigg di caso l'Unità)
- manager Web richiesta durata
- unità di lavoro
Ecco le mie domande:
0.123.Capisco che per avere un'applicazione accoppiata liberamente devi usare qualcosa come Unity. Ma sembra anche che nel momento in cui presenti Unity al mix, devi anche presentare un Web Lifetime Manager. Perché? Perché le applicazioni di esempio come Nerddinner non hanno un Web Lifetime Manager Richiesta? Cosa fa esattamente? È una cosa specifica di Unity?
Un secondo schema che noto è l'introduzione dell'Unità di lavoro. Ancora una volta, la stessa domanda: perché Nerddinner o ContactManager non usano l'Unità di lavoro? Invece queste applicazioni utilizzano le classi di repository su Linq2Sql o Entity Framework per eseguire la manipolazione dei dati. Nessun segno di alcuna unità di lavoro. Che cosa è esattamente e perché dovrebbe essere usato?
Grazie
seguito è riportato un esempio di DI in Nerddiner a livello DinnersController:
public DinnersController()
: this(new DinnerRepository()) {
}
public DinnersController(IDinnerRepository repository) {
dinnerRepository = repository;
}
Così ho ragione di ritenere che a causa del primo costruttore del controllore "possiede" il DinnerRepository e dipenderà quindi dalla durata del controller in quanto viene dichiarato lì?
Grazie! Questo ha aiutato. Ho modificato la mia domanda in fondo. È questo che intendi quando dici che il controller possiede il riferimento al contesto repository/dati? – Thomas
Non esattamente. In NerdDinner usano un costruttore aggiuntivo che accetta IDinnerRepository per rendere più semplici i test unitari. Ma sì, è ancora o controller (costruttore senza parametri) o test che creano e possiedono l'oggetto repository. Entrambi muoiono e non ci sono altri utenti del repository; quindi la vita è semplice. Tra l'altro tale tecnica è cattiva; puoi leggere di più a riguardo qui: http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/07/03/how-not-to-do-dependency-injection-in-nerddinner.aspx (pure come google per "IoC dei poveri"). – queen3
L'argomentazione di Jimmy Bogard su questo esemplare esempio di "IoC del povero uomo" è estremamente buona qui. Anche i commenti sono buoni. Sicuramente vale la pena leggere. –