StructureMap, ObjectFactory et le IContainer
-
22-09-2019 - |
Question
Je travaille avec StructureMap pour mes besoins IoC.
Pour rendre les choses agréablement testable, je passe des instances IContainer
dans la mesure du possible, le plus souvent en tant que paramètres du constructeur. Par souci de commodité, je voudrais être en mesure de revenir à l'aide ObjectFactory
pour un constructeur sans paramètre.
La façon la plus simple (je pensais) à faire serait de simplement obtenir la IContainer
les enveloppements de classe ObjectFactory
et passer que l'autre constructeur. Malheureusement, je ne trouve nulle part cette instance est exposé publiquement.
La question est:
Y at-il un moyen d'obtenir le IContainer
au sein ObjectFactory
donc je peux gérer comme simplement une instance fournie par l'utilisateur?
Sinon, est-il un moyen de dupliquer la configuration du ObjectFactory
dans une nouvelle instance Container
?
Exemple:
Je voudrais être en mesure de faire ce qui suit:
public class MyClass
{
public MyClass()
{
Container = ... // The ObjectFactory container instance.
}
public MyClass(IContainer container)
{
Container = container;
}
public IContainer Container { get; private set; }
}
La solution
ObjectFactory expose une propriété de conteneur qui vous donne la IContainer que vous recherchez.
Chaque fois que vous avez besoin d'un IContainer (qui ne devrait pas être souvent), vous pouvez toujours prendre une dépendance dans votre cteur de classe.
public class INeedAContainer
{
private readonly IContainer _container;
public INeedAContainer(IContainer container)
{
_container = container;
}
// do stuff
}
Je ne pense pas qu'il y ait un moyen de cloner un IContainer. Il existe une méthode container.GetNestedContainer () qui vous permet de garder vos transitoires de même pour la durée de vie du conteneur imbriqué. conteneurs emboîtés sont souvent utilisés dans un « utilisant » déclaration et sont très pratiques pour contrôler l'état des choses comme les limites des transactions de base de données.