Sto cercando di capire quando utilizzare il registro DIC / IoC per configurare il mio software e quando utilizzare le fabbriche, insieme al ragionamento che sta dietro ad entrambi gli approcci.
Sto usando StructureMap come contenitore DI (DIC), che è facile da configurare usando i registri. Nella DIC praticamente tutti gli oggetti registrati sono statici nel senso, che non ho bisogno di cambiare / scambiare alcuna implementazione / istanza in runtime, una volta che il DIC è configurato e sono configurati nel DIC come singleton. Tuttavia, poiché il mio software (SW) funziona su diversi dispositivi, ho bisogno di per selezionare un registro specifico del dispositivo in base al dispositivo su cui viene eseguito il mio SW per configurare l'hardware di conseguenza.
Poiché la costruzione di alcuni miei oggetti richiede la lettura nei file di configurazione, sto usando le fabbriche per restituire queste istanze al DIC, al fine di separare la lettura della configurazione dalla creazione dell'oggetto. Ho registrato i getter di fabbrica nel DIC per i tipi di plugin corrispondenti.
Ora dì che ho un tipo di plugin IMotor
con tipi concreti Motor1
e Motor2
, che dovrebbe essere gestito da una fabbrica. Ora ci sono due modi in cui posso decidere come configurare il mio dispositivo:
- Trasmetto le informazioni sul dispositivo su cui è in esecuzione il SW su
MotorFactory
e restituisce il motore corretto,Motor1
oMotor2
. In questo caso la logica per decidere è inside the Factory. - Configuro il DIC in base al dispositivo su cui è in esecuzione e creo due factory
Motor1Factory
eMotor2Factory
, dove uno creaMotor1
e l'altroMotor2
. In questo caso avrei diverse voci di registro perIMotor
nei registri specifici del dispositivo che utilizzanoMotor1Factory
oMotor2Factory
.
Ora la mia domanda è: quale di questi due metodi è preferibile e perché? Per me, sembra che il primo caso non sia diretto e complicato, poiché sto diffondendo la logica che decide quale tipo di istanziare attraverso il codice base. Mentre nel secondo caso sto effettivamente moltiplicando il numero di fabbriche nel mio codice, dal momento che mi servirà una fabbrica per (quasi) ogni tipo concreto. Diventa ancora più confuso per me, quando le fabbriche astratte vengono aggiunte al mix.
Quindi di nuovo: quando dovrei usare un metodo o l'altro? E ancora più importante: quali sono i buoni indicatori per decidere quale strada da percorrere?