Sto cercando di capire quando utilizzare il registro DIC / IoC per configurare il mio software e quando utilizzare le fabbriche, insieme al ragionamento alla base di entrambi gli approcci.
Sto usando StructureMap come mio contenitore DI (DIC), che è facile da configurare usando i registri. Nel DIC praticamente tutti gli oggetti registrati sono statici, nel senso che non ho bisogno di cambiare / scambiare nessuna implementazione / istanza in fase di esecuzione, una volta che il DIC è configurato e sono configurati nel DIC come singoli. Tuttavia, poiché il mio software (SW) funzionerà su dispositivi diversi, ho bisogno di selezionare un registro specifico del dispositivo in base al dispositivo su cui il mio SW funziona per configurare l'hardware di conseguenza.
Poiché la costruzione di alcuni dei 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 plug-in 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 a
MotorFactory
e restituisce il motore corretto, oMotor1
oMotor2
. In questo caso la logica per decidere è all'interno della Fabbrica. - Configuro il DIC in base al dispositivo su cui è in esecuzione e creo due stabilimenti
Motor1Factory
eMotor2Factory
, dove uno creaMotor1
e l'altroMotor2
. In questo caso avrei voci di registro diverseIMotor
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 contorto, poiché sto diffondendo la logica che decide quale tipo di istanza in tutta la base di codice. Mentre nel secondo caso sto moltiplicando efficacemente il numero di fabbriche nel mio codice, poiché avrò bisogno di una fabbrica per (quasi) ogni tipo di calcestruzzo. Diventa ancora più confuso per me, quando si aggiungono fabbriche astratte 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?