J'ai examiné des applications plus simples comme Nerddinner et ContactManager ainsi que des applications plus complexes comme Kigg. Je comprends les plus simples et maintenant je voudrais comprendre les plus complexes.Passer mon MVC au niveau suivant: DI et unité de travail
Habituellement, les applications les plus simples ont des classes et des interfaces de référentiel (aussi faiblement couplées qu'elles peuvent l'être) au-dessus de LINQtoSQL ou d'Entity Framework. Les référentiels sont appelés à partir des contrôleurs pour effectuer les opérations de données nécessaires.
Un modèle commun que je vois quand j'examine des applications plus complexes comme Kigg ou Oxite est l'introduction de (je qu'effleurer la surface ici mais je dois commencer quelque part):
- CIO DI (en Kigg de affaire Unity)
- Web Demande gestionnaire de vie
- Unité de travail
Voici mes questions:
Je comprends que pour avoir vraiment une application faiblement couplée, vous devez utiliser quelque chose comme Unity. Mais il semble également que le moment où vous présentez Unity au mixage, vous devez également introduire un gestionnaire de demande de vie Web. Pourquoi donc? Pourquoi est-ce que des exemples d'applications comme Nerddinner n'ont pas de gestionnaire de demande de vie Web? Qu'est-ce que cela fait exactement? Est-ce une chose spécifique à l'Unité?
Un deuxième motif que je remarque est l'introduction de l'unité de travail. Encore une fois, même question: Pourquoi Nerddinner ou ContactManager n'utilisent-ils pas Unit of Work? Au lieu de cela, ces applications utilisent les classes de référentiel au-dessus de Linq2Sql ou Entity Framework pour effectuer la manipulation des données. Aucun signe d'unité de travail. Qu'est-ce que c'est exactement et pourquoi devrait-il être utilisé?
Merci
Ci-dessous un exemple de DI en Nerddiner au niveau DinnersController:
public DinnersController()
: this(new DinnerRepository()) {
}
public DinnersController(IDinnerRepository repository) {
dinnerRepository = repository;
}
Alors suis-je raison de supposer qu'en raison du premier constructeur du contrôleur « possède » le DinnerRepository et dépendra donc de la durée de vie du contrôleur puisqu'il y est déclaré?
Merci! Cela a aidé. J'ai édité ma question en bas. Est-ce ce que vous voulez dire quand vous dites que le contrôleur possède la référence au contexte du référentiel/données? – Thomas
Pas exactement. Dans NerdDinner, ils utilisent un constructeur supplémentaire acceptant IDinnerRepository pour faciliter les tests unitaires. Mais oui, il s'agit toujours du contrôleur (constructeur sans paramètre) ou des tests qui créent et possèdent l'objet du référentiel. Ils meurent tous les deux et il n'y a pas d'autres utilisateurs du référentiel; donc la vie est simple. En passant, cette technique est mauvaise. vous pouvez en lire plus à ce sujet ici: http://www.lostechies.com/blogs/jimmy_bogard/archive/2009/07/03/how-not-to-do-dependency-injection-in-nerddinner.aspx (ainsi comme google pour "l'IoC du pauvre"). – queen3
L'argument de Jimmy Bogard à propos de cet exemple flagrant d '«IoC du pauvre» est extrêmement bon ici. Les commentaires sont également bons. Vaut vraiment le coup d'être lu. –