Le StaticFactory dans codecampserver un modèle bien connu?
Question
CodeCampServer code source contient un générique StaticFactory .
Je conjecturant que c'est un élément clé du mécanisme de la façon dont le cadre joue bien avec l'injection de dépendances.
qui utilisent des sous-classes, il est DefaultUnconfiguredState pour fournir un accès statique, bien, un défaut Unconfigured Etat pour eux-mêmes que le mécanisme de résolution de dépendance peut remplacer par des choses de travail.
Je n'ai pas été en mesure de trouver de la documentation pour cette ...
Y at-il une bonne explication dans le livre ? (Je suis en attente de livraison d'Amazon ...)
... ou quelqu'un d'autre peut fournir un bon commentaire sur ce que cela est et si je serais sage d'adopter ce modèle (si elle est un ...)?
Mise à jour
Depuis Jeffrey Palermo a répondu à cette question, je vois que dans le ce modèle / style (travail en cours) manuscrit pour MVC2 en action est discutée et illustrée à l'aide d'une usine qui est utilisé pour localiser un dépôt afin de maintenir la couche de domaine ignorant des problèmes de persistance. (Voir chapitre 23 ).
Par défaut, l'utilisation de cette usine jette une exception:
«la connaissance de la façon de créer la dépôt ne réside pas avec le usine. Cette usine seulement représente la capacité de revenir le dépôt "
L'exemple aurait pu utiliser l'un des mécanismes pour l'initialisation d'une mise en œuvre concrète de l'interface du référentiel. Dans l'exemple dans le livre qu'ils choisissent de ne pas utiliser un contenant du CIO pour un souci de simplicité et de fournir explicitement dans une logique de démarrage.
"La chose importante est que ni le projet de base, ni le projet de l'interface utilisateur devrait faire référence à l'infrastructure projet ou les bibliothèques qui sont purement infrastructurel dans la nature. On a gardé NHibernate complètement à la côté de sorte que le reste de la l'application ne se soucie pas comment les données l'accès se passe "
Un dernier point à noter sur le code exemple dans ce nouveau chapitre est que l'usine est plus statique (au moins pas aussi loin que l'interface tournés vers l'extérieur est concerné).
Mise à jour 2
M. Palerme blogué un peu plus sur ce style particulier de l'usine Résumé (voir la implementaion de OrderShipperFactory).
Je pourrais aussi considérer simplement 'Manuel injection de dépendance' (oncle Bob).
Mise à jour 3 - Mars 2016
Il y a un autre exemple de celui-ci ici , bien que Jeffrey est explicite à ce sujet être le code de démonstration, et le commentaire indique que cela serait configuré dans ce que Mark Seeman appellerait un Composition racine (par exemple à l'application de démarrage)
J'ai découvert ce dans l'article de Jeffrey « Architecture de l'oignon: partie 4 - Après quatre ans "
La solution
Bonne question. Je ne l'aime pas non plus. Il devrait vraiment être nommé « StartupFactoryConfiguration », mais il est sur la liste de refactoring.
Nous avons joué avec cette idée comme un moyen de mettre en place DI pour les lieux qui ne sont pas sous l'injection de constructeur via le conteneur.
Il disparaîtra. Je ne sais pas ce que l'anti-modèle est (quel nom?), Mais StaticFactory va mourir.
Maintenant, il a été rebaptisé ce matin. Il est maintenant AbstractFactoryBase. Il est une implémentation du motif Fabrique Abstraite: http://en.wikipedia.org/wiki/Abstract_factory_pattern
La mise en œuvre de l'usine est de finir par appeler un contrainer IoC, mais elle permet d'accéder à partir d'un endroit dans le code sans référence d'assemblage à l'ensemble de conteneur IoC.
Cordialement, Jeffrey Palermo
Autres conseils
Tout statique est un ennemi de DI.
Cette StaticFactory ressemble à une mise en œuvre du
Je considère Service de localisation pour être un anti-modèle, car il est totalement opaque à l'utilisateur de l'API dont les dépendances doivent être mises en place; ainsi, on pourrait facilement appeler des méthodes sur des objets dans un contexte où le service de localisation jetterait, et l'API vous donne absolument aucune idée que ce soit le cas. DI appropriée, comme l'utilisation abondante de Injection Constructor est une bien meilleure alternative.