2012-10-16 8 views
5

Mi sento come se fossi bloccato tra diverse soluzioni sbagliate qui e ho bisogno di alcuni consigli su come ridurre al minimo l'agonia futura. Stiamo usando Massive ORM, che nel suo costruttore ha queste linee:Modesto modo di modificare il comportamento del costruttore

var _providerName = "System.Data.SqlClient"; 

if (ConfigurationManager.ConnectionStrings[connectionStringName].ProviderName != null) 
    _providerName = ConfigurationManager.ConnectionStrings[connectionStringName].ProviderName; 

_factory = DbProviderFactories.GetFactory(_providerName); 
ConnectionString = ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString; 

La parte importante per me qui è che legge le stringhe di connessione da ConfigurationManager. Stiamo cercando di centralizzare la configurazione e, nel farlo, vogliamo mantenere le stringhe di connessione fuori dal nostro web/app.configs (abbiamo circa 150 host distribuiti, quindi il sovraccarico sta diventando significativo). Tuttavia, questo si interrompe poiché il file di configurazione letto è hardcoded qui e la raccolta ConnectionStrings è di sola lettura (ci sono soluzioni alternative, ma sono tutte abbastanza sporche).

Una possibile via d'uscita è estrarre queste linee in un metodo virtuale e quindi modificarle con l'ereditarietà. Non è così bello quando vogliamo aggiornare Massive, e anche chiamare metodi virtuali da un costruttore è potenzialmente negativo.

Quali altre alternative ho? La priorità principale qui è minimizzare l'impatto durante l'aggiornamento.

+1

Questa sembra un'opportunità per il modello di Service Locator: http://en.wikipedia.org/wiki/Service_locator_pattern –

+0

@JoshC .: Sì, un'alternativa è quella di refactoring in qualche interfaccia 'IConfigurationManager' che ha un valore predefinito l'implementazione utilizza semplicemente ConfigurationManager. Non sono sicuro, tuttavia, quali sono i pro/contro rispetto all'ereditarietà? – carlpett

+0

E riguardo la memorizzazione delle stringhe di connessione in un file separato? sarebbe d'aiuto? (vedi 'Uso dei file di configurazione esterni' msdn.microsoft.com/en-us/library/ms254494(v=vs.80).aspx) –

risposta

1

Alla fine, abbiamo deciso di apportare una modifica minima alla classe di grandi dimensioni rendendola parziale. Quindi, in un file separato, abbiamo aggiunto un costruttore aggiuntivo che ha accettato parametri diversi. In questo modo, se aggiorniamo la libreria, l'unica modifica che dobbiamo apportare è di aggiungere nuovamente partial.

1

È possibile eliminare la dipendenza dell'origine di configurazione dell'oggetto passando tutti i campi richiesti attraverso il costruttore.

Vedere Martin Fowler's article su Dipendenza dell'iniezione. Lo stesso concetto si applica qui.

Problemi correlati