2010-05-18 11 views
6

Est-il bon d'avoir une méthode d'usine pour récupérer des objets injectés ou est-ce OK pour simplement utiliser la méthode de fabrication du cadre de DI? J'utilise map de structure, devrais-je simplement utiliser ObjectFactory.GetInstance() ;, ou devrais-je créer une classe de fabrique et dans cette classe appel ObjectFactory.GetInstance() ;? parce que si j'appelle ObjectFactory.GetInstance(); dans mes cours, je créerais un couplage avec le cadre DI? désolé si je suis ignorant, je suis nouveau à ces concepts. Merci!Utiliser l'usine pour obtenir des objets Injecté

Répondre

3

Si vous utilisez déjà un cadre de DI pourquoi re-mettre en œuvre le modèle d'usine quand il est déjà fourni par le cadre? De même, vous ne devez pas créer de dépendance avec le cadre DI dans les couches de gestion de l'application. Là, vous devriez faire abstraction avec des interfaces et des classes abstraites. La structure DI doit uniquement être utilisée au niveau le plus élevé, par exemple dans l'interface graphique pour effectuer la plomberie des couches inférieures et sélectionner par exemple une couche d'accès aux données appropriée.

+1

Je suis d'accord avec Darin, laissez le cadre de DI faire son travail au lieu de dupliquer les fonctionnalités. –

3

Une méthode d'usine est utile lorsque vous avez besoin d'un contrôle précis sur lorsque vous avez besoin de l'instance. Cependant, vous ne devez pas dépendre directement du conteneur mais injecter une méthode factory en tant que dépendance. Voici un exemple illustrant ceci:

public class SomeController 
{ 
    private Func<ISomeService> _serviceFactory; 
    public SomeController(Func<ISomeService> serviceFactory) 
    { 
     _serviceFactory = serviceFactory; 
    } 

    public void DoSomeWork() 
    { 
     var service = _serviceFactory(); 
     .... 
    } 
} 

Le code d'enregistrement StructureMap ressemblerait à quelque chose comme ceci:

var container = new Container(cfg => 
    cfg.For<ISomeService>().Use(() => new SomeServiceImpl()) 
);