Iniezione di proprietà / impostazioni in un'applicazione

6

Nelle applicazioni che scrivo al lavoro, spesso ho bisogno di avere un file di proprietà / impostazioni esterno in modo che determinati parametri possano essere configurati dopo che l'applicazione è stata distribuita all'utente finale. Il file sarà di solito testo o XML e di solito verrà implementato in C ++ o Java.

In passato, ho creato classi Singleton per gestire l'iniezione di queste proprietà / impostazioni nella mia applicazione. La classe verrebbe inizializzata con il percorso di un file, essere codificata con le chiavi di proprietà che sta cercando nel file, leggerla e memorizzare tutti gli attributi. Altre classi nell'applicazione eseguiranno quindi una chiamata come propertySingleton::getInstance().getMyParameter() .

Più leggo e apprendo sull'ingegneria del software e sulla progettazione, più questo approccio appare goffo e intrinsecamente sbagliato. Mi stavo chiedendo se qualcuno doveva svolgere compiti simili, e come avrebbero affrontato questo approccio in modo ben orientato agli oggetti?

    
posta Andrew Humphries 09.09.2011 - 08:12
fonte

4 risposte

2

Il tuo approccio al singleton è abbastanza buono se:

  • non cerchi la configurazione con un percorso assoluto (usando un percorso relativo, o meglio ancora un percorso di classe dovresti stare bene)
  • se non si reinventa la ruota e in Java si utilizza un'API per caricare le proprietà come JDK Proprietà o potente PropertyConfiguration di Apache.

Inoltre, una soluzione molto migliore, se si utilizza un framework IOC come Spring, ad esempio, come suggerito da Ankit, quindi l'utilizzo di PropertyPlaceholderConfigurer è davvero una buona opzione poiché è sufficiente configurare questo bean singleton e non si t necessario scrivere qualsiasi codice.

    
risposta data 09.09.2011 - 09:04
fonte
1

un singleton è un uso appropriato per un servizio globale; non vedo nulla di sbagliato in questo approccio

    
risposta data 09.09.2011 - 08:18
fonte
1

Avere gli oggetti 'richiama' un singleton statico per ottenere le impostazioni crea una dipendenza. Non è migliore di l'anti-pattern 'locator di servizio' .

Vorrei invertire tale dipendenza impostando i parametri / proprietà del costruttore delle impostazioni e facendoli rifornire dal mio contenitore IOC. In questo modo l'unica cosa che dipende esplicitamente dalle "impostazioni" è l'oggetto responsabile della costruzione.

La maggior parte dei contenitori IOC offre la possibilità di configurare le dipendenze utilizzando XML, quindi questo potrebbe servire come un sistema di configurazione migliore. Io uso Autofac e una soluzione personalizzata qui:

link

    
risposta data 09.09.2011 - 09:05
fonte
0

Penso che qualcosa come Spring PropertyPlaceHolderConfigurer o un'estensione di esso possa essere utile in questi casi. Dove da una parte non fai la tua classe Singleton e permette alla tua classe di essere adeguatamente testata.

E dall'altra parte, contrassegni il tuo bean come un singleton in modo che ci sia una sola istanza alla volta nel sistema.

    
risposta data 09.09.2011 - 09:01
fonte

Leggi altre domande sui tag