Nous utilisons StructureMap comme structure d'injection de dépendances (DI) pendant la création d'une bibliothèque en couches. Nos objectifs sont les suivants:Questions à propos de StructureMap dans une bibliothèque (en couches) concernant l'extensibilité et la testabilité
- Facilitez-vous pour les classes de tests unitaires (et en utilisant des classes fictives au lieu des dépendances réelles) pendant que nous développons et maintenons la bibliothèque.
- le rendre facile pour l'utilisateur de bibliothèque:
- Personnaliser le comportement bibliothèque en mettant en œuvre une interface les selfs et la configuration de la bibliothèque d'utiliser leur mise en œuvre à la place de notre propre. Unité Tester leurs classes implémentées (c'est le même objectif que nous avons en interne, mais nous voulons qu'il soit également rempli pour l'utilisateur de la bibliothèque).
Par bibliothèque en couches, nous entendons que nous construisons deux DLL`s:
- La bibliothèque de base. Il devrait être utilisable à partir de n'importe quelle application .NET, que ce soit une application console ou MVC.
- Une bibliothèque WebForms. Il inclut la bibliothèque de base mais fournit également le contrôle de WebForms pour faciliter la vie des utilisateurs de WebForms.
Nos questions:
Où devrions-nous appeler le code pour la carte des interfaces avec des classes concrètes pour la bibliothèque de base? Il n'a pas de point d'entrée unique, il existe de nombreuses classes qui peuvent être instanciées en premier.
Actuellement, nous obligeons l'utilisateur à appeler
DependencyHandler.Init()
avant de faire un autre appel de bibliothèque. Existe-t-il un moyen plus agréable, comme un morceau de code qui est exécuté après avoir chargé la DLL afin que nous n'obligions pas l'utilisateur à écrire une ligne de code de plaque de chaudière?Quelle est la méthode recommandée pour permettre aux utilisateurs de bibliothèque de modifier une implémentation d'interface dans leur propre type? Actuellement, l'utilisateur peut récupérer le registre par
StructureMap.Configuration.DSL.Registry theRegistry = DependencyHandler.Instance().GetConfiguration()
puis modifier les choses par exempletheRegistry.For<IFoo>().Use<MyOwnFooImplementation>();
Serait-il plus agréable d'utiliser XML? Et si oui, où devrions-nous mettre ledit XML? Nous choisissons l'approche programmatique car Visual Studio pourra donner de l'aide à l'utilisateur. Si l'approche actuelle dans ci-dessus est utilisée, l'utilisateur de la bibliothèque est nécessaire (au moins maintenant) pour ajouter une référence à StructureMap.DLL ainsi qu'à notre DLL. Pouvons-nous supprimer ce fardeau de l'utilisateur, peut-être en utilisant XML pour l'installation de dépendances à la place?Existe-t-il un bon emplacement central dans WebForms que nous devrions utiliser, ce qui résout le problème pour la DLL de la bibliothèque WebForms?
Comment recommandez-vous de structurer les choses pour la production et les essais? L'idée actuelle est d'utiliser DI dans tous les endroits nécessaires pour permettre le test unitaire où nous et nos utilisateurs le souhaitons, ainsi que de permettre aux utilisateurs de changer le comportement de la bibliothèque en fournissant leurs propres implémentations.
Pour tester les choses, nous et les utilisateurs de la bibliothèque devront créer des classes fictives pour remplacer les dépendances que nous voulons dissocier. L'idée est que nous utilisons la configuration normale mais surcharger les classes que nous voulons mocker au lieu d'utiliser leur implémentation normale. Est-ce une bonne façon de procéder?