J'essaie de comprendre quand utiliser le registre DIC / IoC pour configurer mon logiciel et quand utiliser des usines, ainsi que le raisonnement derrière l'une ou l'autre approche.
J'utilise StructureMap comme mon conteneur DI (DIC), qui est facile à configurer à l'aide de registres. Dans le DIC, pratiquement tous les objets enregistrés sont statiques dans le sens où je n'ai pas besoin de changer / échanger d'implémentation / instance au moment de l'exécution, une fois le DIC configuré et ils sont configurés dans le DIC en tant que singletons. Cependant, étant donné que mon logiciel (SW) s'exécutera sur différents appareils, je dois sélectionner un registre spécifique à l'appareil en fonction de l'appareil sur lequel mon SW s'exécute afin de configurer le matériel en conséquence.
Étant donné que la construction de certains de mes objets nécessite la lecture des fichiers de configuration, j'utilise des usines pour renvoyer ces instances au DIC, afin de séparer la lecture de la configuration de la création de l'objet. J'ai enregistré les getters d'usine dans le DIC pour les types de plugins correspondants.
Disons maintenant que j'ai un type de plugin IMotor
avec des types concrets Motor1
et Motor2
, qui devrait être géré par une usine. Il y a maintenant deux façons de décider comment configurer mon appareil:
- Je passe des informations sur le dispositif que le SW est en cours d' exécution à un
MotorFactory
et il renvoie le moteur correct, que ce soitMotor1
ouMotor2
. Dans ce cas, la logique de décision est à l' intérieur de l'usine. - Je configure le DIC en fonction de l'appareil sur lequel il fonctionne et crée deux usines
Motor1Factory
etMotor2Factory
, où l'une créeMotor1
et l'autreMotor2
. Dans ce cas, j'aurais des entrées de registre différentes pourIMotor
les registres spécifiques au périphérique qui utilisent soitMotor1Factory
ouMotor2Factory
.
Maintenant ma question est: laquelle de ces deux méthodes est préférable et pourquoi? Pour moi, il semble que le premier cas ne soit pas simple et compliqué, car j'étends la logique qui décide du type à instancier dans la base de code. Alors que dans le second cas, je multiplie effectivement le nombre d'usines dans mon code, car j'aurai besoin d'une usine pour (presque) chaque type de béton. Cela devient encore plus déroutant pour moi, lorsque des usines abstraites sont ajoutées au mélange.
Encore une fois: quand dois-je utiliser une méthode ou l'autre? Et plus important encore: quels sont les bons indicateurs pour décider de la voie à suivre?