So che questa domanda è vecchia ma vorrei aggiungere i miei cinque centesimi,
Penso che l'iniezione di dipendenza (DI) sia in molti modi simile a un modello di fabbrica configurabile (FP), e in questo senso qualsiasi cosa tu possa fare con DI, sarai in grado di farlo con tale fabbrica.
In realtà, se ad esempio usi la primavera, hai la possibilità di autorizzare risorse (DI) o fare qualcosa del genere:
MyBean mb = ctx.getBean("myBean");
E poi usa quell'istanza 'mb' per fare qualsiasi cosa. Non è una chiamata a una fabbrica che ti restituirà un'istanza ??
L'unica vera differenza che noto tra la maggior parte degli esempi di FP è che puoi configurare ciò che "myBean" è in un xml o in un'altra classe, e un framework funzionerà come factory, ma a parte questo è la stessa cosa, e tu può avere sicuramente una Factory che legge un file di configurazione o ottiene l'implementazione di cui ha bisogno.
E se mi chiedi la mia opinione (e so che non l'hai fatto), credo che DI faccia la stessa cosa ma aggiunga solo più complessità allo sviluppo, perché?
bene, per prima cosa, per sapere qual è l'implementazione utilizzata per qualsiasi bean che autorizzi con DI, devi andare alla configurazione stessa.
ma ... che dire di quella promessa che non dovrete conoscere l'implementazione dell'oggetto che state usando? pfft! sul serio? quando usi un approccio come questo ... non sei lo stesso che scrive l'implementazione ?? e anche se non lo fai, non sei quasi sempre alla ricerca di come l'implementazione fa quello che dovrebbe fare ??
e per un'ultima cosa, non importa quanto un framework DI ti prometta che costruirai cose disaccoppiate da esso, senza dipendenze dalle loro classi, se stai usando un framework costruisci tutto ciò che lo attira, se devi cambiare l'approccio o il framework non sarà un compito facile ... MAI! ... ma dal momento che costruisci tutto intorno a quel particolare quadro invece di preoccuparti di quale sia la soluzione migliore per la tua attività, allora dovrai affrontare un problema.
In effetti, l'unica vera applicazione aziendale per un approccio FP o DI che posso vedere è se devi cambiare le implementazioni utilizzate in fase di esecuzione , ma almeno i framework che conosco non ti consentono di farlo, devi lasciare tutto perfetto nella configurazione in fase di sviluppo e se ne hai bisogno usa un altro approccio.
Quindi, se ho una classe che si comporta in modo diverso in due ambiti nella stessa applicazione (diciamo, due società di una holding) devo configurare il framework per creare due bean diversi e adattare il mio codice per usarli ciascuno. Non è lo stesso che scriverei qualcosa del genere:
MyBean mb = MyBeanForEntreprise1(); //In the classes of the first enterprise
MyBean mb = MyBeanForEntreprise2(); //In the classes of the second enterprise
lo stesso di questo:
@Autowired MyBean mbForEnterprise1; //In the classes of the first enterprise
@Autowired MyBean mbForEnterprise2; //In the classes of the second enterprise
E questo:
MyBean mb = (MyBean)MyFactory.get("myBeanForEntreprise1"); //In the classes of the first enterprise
MyBean mb = (MyBean)MyFactory.get("myBeanForEntreprise2"); //In the classes of the second enterprise
In ogni caso dovrai cambiare qualcosa nella tua applicazione, che si tratti di classi o file di configurazione, ma dovrai farlo per ridistribuirlo.
Non sarebbe bello fare una cosa del genere:
MyBean mb = (MyBean)MyFactory.get("mb");
E in questo modo, si imposta il codice di fabbrica per ottenere la corretta implementazione in fase di esecuzione a seconda dell'impresa dell'utente registrato ?? Ora che sarebbe utile. Potresti semplicemente aggiungere un nuovo vaso con le nuove classi e impostare le regole forse anche anche in fase di esecuzione (o aggiungere un nuovo file di configurazione se lasci questa opzione aperta), nessuna modifica alle classi esistenti. Questa sarebbe una fabbrica dinamica!
non sarebbe più utile che dover scrivere due configurazioni per ciascuna impresa e magari avere anche due applicazioni diverse per ognuna ??
Puoi dirmi che non ho mai bisogno di fare lo switch in fase di runtime, quindi configuro l'app, e se eredito la classe o utilizzo un'altra implementazione cambio semplicemente la configurazione e la ridistribuzione. Ok, questo può essere fatto anche con una fabbrica. E ad essere sincero, quante volte lo fai? forse solo quando hai un'app che verrà utilizzata da qualche altra parte nella tua azienda e passerai il codice a un altro team e loro faranno cose del genere. Ma hey, questo può essere fatto anche con la fabbrica, e sarebbe ancora meglio con una fabbrica dinamica !!
Ad ogni modo, la sezione dei commenti è aperta per consentirmi di uccidermi.