2010-08-24 6 views
1

J'ai une application ASP.Net MVC et j'utilise StructureMap dans MVC pour coller l'ensemble de l'application. Certaines classes de modèle ont des dépendances lourdes qui ne sont pas utilisées dans toutes les méthodes publiques. Je passe donc un IContainer au constructeur du modèle et l'utilise pour créer les dépendances lourdes à la demande.StructureMap injecté IContainer - d'où vient-il?

Ma question est d'où vient le IContainer qui est injecté? S'agit-il d'une référence à celle qui est centralisée par MVC (c'est le parent logique) ou s'agit-il d'une toute nouvelle création et configuration uniquement pour cette classe?

Répondre

2

Le conteneur injecté dans un constructeur qui a un paramètre IContainer est le même conteneur qui crée l'instance de la classe avec le constructeur.

Jeremy Miller a exprimé ce comportement comme "IContainer est injecté dans lui-même par défaut" dans son blog post on NHibernate with StructureMap. Vous ne pourriez pas aller avec un modèle d'usine pour créer ces dépendances si nécessaire afin de réduire votre couplage au conteneur?

Vous pouvez faire votre modèle prendre un Func en tant que paramètre et utiliser la capacité de SM à ceux autoinject:

public class MyModel 
{ 
    Func<IHeavyDep> _heavyFactory; 
    public MyModel(Func<IHeavyDep> dependency) 
    { 
     _heavyFactory = dependency; 
    } 

    public void UsesHeavy() 
    { 
     var heavy = _heavyFactory(); 
     heavy.DoMyStuff(); 
    } 
}