Méthode de fabrique avec du DI et du Cio

Je suis familier avec ces modèles, mais ne sais toujours pas comment gérer la situation suivante:

public class CarFactory
{
     public CarFactory(Dep1,Dep2,Dep3,Dep4,Dep5,Dep6)
     {
     }

     public ICar CreateCar(type)
     {
            switch(type)
            {
               case A:
                   return new Car1(Dep1,Dep2,Dep3);
               break;

               case B:
                   return new Car2(Dep4,Dep5,Dep6);
               break;
            }
     }
}

En général le problème est avec la quantité de références qui doit être injectée. Ce sera encore pire quand il y a plus de voitures.

Première approche qui me vient à l'esprit est d'injecter de Car1 et les personnages car2 dans l'usine du constructeur, mais il est contre l'approche parce que l'usine sera de retour toujours le même objet. La deuxième approche consiste à injecter servicelocator mais c'est antipattern partout. Comment le résoudre?

Edit:

Alternative 1:

public class CarFactory
{
     public CarFactory(IContainer container)
     {
        _container = container;
     }

     public ICar CreateCar(type)
     {
            switch(type)
            {
               case A:
                   return _container.Resolve<ICar1>();
               break;

               case B:
                     return _container.Resolve<ICar2>();
               break;
            }
     }
}

Alternative 2 (trop difficile à utiliser en raison d'un trop grand nombre de dépendances dans l'arbre):

public class CarFactory
{
     public CarFactory()
     {
     }

     public ICar CreateCar(type)
     {
            switch(type)
            {
               case A:
                   return new Car1(new Dep1(),new Dep2(new Dep683(),new Dep684()),....)
               break;

               case B:
                    return new Car2(new Dep4(),new Dep5(new Dep777(),new Dep684()),....)
               break;
            }
     }
}
  • Une pensée rapide est de faire un mappage de classe qui prend un type en entrée et retourne les trois Dep# vous avez besoin. Alors vous pouvez mapper toutes les dépendances, dans une instance de la cartographie de la classe dans le programme d'amorçage, puis injecter la cartographie de l'instance dans l'usine.
  • Je pense qu'il n'y a rien de mal avec Alternative way 1 que vous avez montré lors de la mise en œuvre de cette usine appartient à Composition Root. De ne pas vous inscrire DI conteneur lui-même dans le conteneur d'injection de dépendances
  • Que voulez-vous dire qu'il appartient à la Composition de la Racine? Pourriez-vous donner quelques exemples de code?
  • La Composition de la Racine est l'endroit où vous vous reliez votre demande de conteneur d'injection de dépendances. Ainsi, par exemple, cela peut être un Bootstrap classe.
InformationsquelleAutor MistyK | 2015-08-11