DI / contenitore IoC vs fabbriche: dove configuro la mia domanda e perché?

8

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:

  1. Trasmetto le informazioni sul dispositivo su cui è in esecuzione il SW su MotorFactory e restituisce il motore corretto, Motor1 o Motor2 . In questo caso la logica per decidere è inside the Factory.
  2. Configuro il DIC in base al dispositivo su cui è in esecuzione e creo due factory Motor1Factory e Motor2Factory , dove uno crea Motor1 e l'altro Motor2 . In questo caso avrei diverse voci di registro per IMotor nei registri specifici del dispositivo che utilizzano Motor1Factory o Motor2Factory .

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?

    
posta packoman 12.08.2016 - 10:01
fonte

3 risposte

2

Se usi entrambi, farò qualcosa di semplice:

  • DI / IoC: per ogni configurazione che non verrà modificata in fase di runtime.
  • Fabbrica: per la creazione di un'istanza di oggetti in fase di esecuzione che dipende dai parametri di input del runtime. Le istanze della fabbrica vengono iniettate dal contenitore DI.
risposta data 26.07.2017 - 13:43
fonte
1

Le fabbriche astratte vengono utilizzate quando si hanno oggetti correlati attraverso una gerarchia che deve variare insieme. Non lo vedo qui.

Quello che vedo è che ti stai chiedendo se una fabbrica dovrebbe scegliere il motore o se il DIC dovrebbe scegliere una fabbrica che produce un motore particolare.

È difficile scegliere esattamente perché una fabbrica e una DIC fanno cose molto simili. La differenza è che la fabbrica è focalizzata su un particolare problema e la DIC è più generale.

Si tratta di questa domanda: hai bisogno di un codice specifico per questo problema che risiederà in fabbrica? Oppure è più generale come leggere i dettagli di configurazione da un file?

Tieni presente che, sebbene tu possa scegliere solo tra Motor1 e Motor2 oggi, domani potrebbe esserci un Motor3 . Favorisci il design che renderebbe Motor3 facile da aggiungere.

    
risposta data 26.07.2017 - 12:40
fonte
0

Vorrei separare la logica "quale motore usare" in una Fabbrica speciale chiamata Builder (pattern) e utilizzare il contenitore IOC per entrambi i motori come dettaglio di implementazione del builder.

Come regola generale:

  • hai bisogno di una fabbrica (o di un costruttore) se devi creare molti oggetti dinamici della classe / interfaccia. (Ad esempio, per ogni auto prodotta devi creare un nuovo motore)
  • se hai bisogno di una sola istanza statica di una classe, l'ioc / di può eseguire il lavoro per te (cioè hai bisogno di una sola istanza statica del servizio di pagamento e di un'istanza statica di MotorBuilderService)
risposta data 26.07.2017 - 13:27
fonte

Leggi altre domande sui tag