Estou tentando descobrir quando usar o registro DIC / IoC para configurar meu software e quando usar fábricas, juntamente com o raciocínio por trás de qualquer uma dessas abordagens.
Estou usando o StructureMap como meu contêiner de DI (DIC), que é fácil de configurar usando registros. No DIC, praticamente todos os objetos registrados são estáticos no sentido de que eu não preciso alterar / trocar nenhuma implementação / instância no tempo de execução, uma vez que o DIC esteja configurado e configurado no DIC como singletons. No entanto, como meu software (SW) será executado em dispositivos diferentes, preciso selecionar um registro específico do dispositivo, dependendo do dispositivo em que o SW for executado, para configurar o hardware adequadamente.
Como a construção de alguns dos meus objetos requer leitura nos arquivos de configuração, estou usando fábricas para retornar essas instâncias ao DIC, a fim de separar a leitura da configuração da criação do objeto. Registrei os getters de fábrica no DIC para os tipos de plugins correspondentes.
Agora diga que eu tenho um tipo de plug-in IMotor
com tipos concretos Motor1
e Motor2
, que deve ser tratado por uma fábrica. Agora, existem duas maneiras de decidir como configurar meu dispositivo:
- Eu passo informações sobre o dispositivo em que o SW está executando
MotorFactory
e retorna o motor correto,Motor1
ouMotor2
. Nesse caso, a lógica para decidir está dentro da fábrica. - Eu configuro o DIC de acordo com o dispositivo em que ele está sendo executado e crio duas fábricas
Motor1Factory
eMotor2Factory
, onde uma criaMotor1
e a outraMotor2
. Nesse caso, eu teria entradas de registro diferentes paraIMotor
os registros específicos do dispositivo que usamMotor1Factory
ouMotor2Factory
.
Agora, minha pergunta é: Qual desses dois métodos é preferível e por quê? Para mim, parece que o primeiro caso não é direto e complicado, pois estou espalhando a lógica que decide que tipo instanciar a base de código. Enquanto no segundo caso estou multiplicando efetivamente o número de fábricas no meu código, pois precisarei de uma fábrica para (quase) cada tipo de concreto. Torna-se ainda mais confuso para mim, quando fábricas abstratas são adicionadas à mistura.
Novamente: quando devo usar um método ou outro? E mais importante: quais são os bons indicadores para decidir qual caminho seguir?