2010-01-26 14 views
2

Je travaille avec StructureMap pour mes besoins IoC.StructureMap, ObjectFactory et IContainer

Pour rendre les choses agréablement testables, je passe les instances IContainer autant que possible, généralement en tant que paramètres du constructeur. Par commodité, j'aimerais pouvoir utiliser ObjectFactory pour un constructeur sans paramètre.

La manière la plus simple (j'ai pensé) de faire ceci serait d'obtenir simplement le IContainer les enveloppes de classe ObjectFactory et de passer cela à l'autre constructeur. Malheureusement, je ne peux pas trouver n'importe où cette instance est exposée 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?

Vous pouvez également 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; } 
} 
+0

Si ma réponse a raté la note. Pouvez-vous donner un exemple d'utilisation? – KevM

Répondre

5

ObjectFactory expose une propriété de conteneur qui vous donne la IContainer que vous recherchez.

Chaque fois que vous avez besoin d'un IContainer (ce qui ne devrait pas être souvent), vous pouvez toujours en tenir compte dans votre classe ctor.

public class INeedAContainer 
{ 
    private readonly IContainer _container; 

    public INeedAContainer(IContainer container) 
    { 
     _container = container; 
    } 

    // do stuff 
} 

Je ne pense pas qu'il existe un moyen de cloner un IContainer. Il existe une méthode container.GetNestedContainer() qui vous permet de conserver vos transitoires identiques pour la durée de vie du conteneur imbriqué. Les conteneurs imbriqués sont souvent utilisés dans une instruction "using" et sont très pratiques pour contrôler l'état des choses comme les limites de transaction de base de données.

+0

Je ne suis pas sûr si cela me fournit une réponse. J'ai mis à jour ma question pour clarifier le scénario. –

+0

Merci pour la nouvelle mise à jour. J'ai patouillé sur ObjectFactory et n'ai trouvé aucune propriété Container. Après votre réponse a dit qu'il devrait y en avoir un, j'ai mis à jour la dernière version et violla! Merci. –