2011-10-04 18 views
11

Sto cercando un buon modo per ottenere quanto segue:Accedi a web.config da una libreria di classi separata?

Ho un'applicazione Web (MVC 3), con una libreria di classi separata che contiene la logica di back-end di un CMS che sto creando. Questo CMS utilizza NHibernate per connettersi a un database. Voglio che l'utente sia in grado di configurare il connectiontring (e eventualmente anche il sapore del database) nel loro file web.config.

Quello che sto cercando è un buon modo per ottenere la stringa di connessione dal file web.config, anche se la DLL è completamente separata. È possibile? Devo passare la mia stringa di connessione alla mia libreria di classi in qualche modo? O potrò accedervi quando l'applicazione è in esecuzione?

Se devo creare un codice nella mia applicazione Web per passare la stringa di connessione alla mia libreria di classi, come posso rendere questo codice il più portabile possibile, quindi non dovrò scriverlo di nuovo per la mia prossima webapp ?

Grazie mille per tutte le idee che avete.

risposta

17

È possibile passare la stringa di connessione alle classi nella libreria di classi dal sito Web.

Questa è una scelta migliore rispetto al tentativo di ottenere le informazioni direttamente dal file di configurazione, in quanto altrimenti si avrà una dipendenza dal file di configurazione esistente con il giusto tasto esatto (rendendo il test della classe un po 'più difficile).

Vedere this blog post per argomenti contro l'accesso diretto alla configurazione (operazione eseguita molto comunemente, ma non è la procedura consigliata).

+0

+1 per facilitare i test. Separare l'ottenimento della configurazione dall'uso di essa – SHug

8

È possibile accedere a System.Configuration.ConfigurationManager dalla libreria di classi. Ciò ti consentirà di accedere a AppSettings e ConnectionStrings.

+3

Cattiva idea. La configurazione è una dipendenza e deve essere passata direttamente. http://www.devtrends.co.uk/blog/configuration-settings-are-a-dependency-that-should-be-injected – Oded

+2

@Oded - l'implementazione di un'interfaccia non è meno problematica dell'aggiunta di elementi a un'app .config. Inoltre elude diverse funzionalità di sicurezza integrate nel gestore di configurazione .net, come la possibilità di crittografare le stringhe di connessione e il fatto che Web.config non può essere modificato dall'applicazione. Per non parlare del fatto che chiunque utilizzi la tua libreria dovrà anche imparare un nuovo modo di configurare le cose invece di utilizzare uno standard del settore. –

+0

@CharlesLambert - Il fatto che si tratti di una tecnica ampiamente utilizzata non ne fa una buona abitudine. Se si verifica il livello di accesso ai dati, è necessario aggiungere i file di configurazione agli assembly di test. – Oded

0

Poiché si sta utilizzando la libreria di classi per l'applicazione Web MVC, è accessibile anche alla libreria di classi. Non sono necessarie ulteriori impostazioni. Anche se la libreria di classi quando viene creata fornisce una dll separata, viene referenziata nel progetto corrente. Quindi la stringa di connessione sarà disponibile anche per la libreria di classi.

0

Vorrei andare con qualcosa come Autofac per darvi un'implementazione IoC in grado di memorizzare un'interfaccia di impostazioni per le stringhe di connessione. Ciò consentirebbe di impostare il valore da web.config all'avvio dell'applicazione o di impostarlo nei test su un valore diverso senza che la libreria di classi debba mai essere accoppiata a un web.config.

1

Ho esattamente la stessa configurazione con un progetto FOSS con cui sono coinvolto. Contiene tutto (anche i Controller e Global.asax.cs) nella libreria di classi 'Core'.

C'è un sacco di soluzioni valide, quella che ho optato per era quello di creare una classe Impostazioni che è essenzialmente un insieme di proprietà statiche, all'interno del quale si ha:

public static string ConnectionString 
{ 
     get { return ConfigurationManager.ConnectionStrings["MYAPP"].ConnectionString; } 
} 

Nota: assicurarsi che la libreria di classi System.Configuration è stato aggiunto come riferimento.

all'interno della vostra applicazione (la classe derivata da HttpApplication) si passa le impostazioni attraverso, anche se non c'è nulla che impedisca di tighly accoppiamento il setup NH con la classe impostazioni:

protected void Application_Start() 
{ 
     AreaRegistration.RegisterAllAreas(); 
     RegisterRoutes(RouteTable.Routes); 
     SetupNHibernate(); 
} 

public virtual void SetupNHibernate() 
{ 
     NHibernateRepository.Current.Configure(RoadkillSettings.DatabaseType, Settings.ConnectionString, false, Settings.CachedEnabled); 
} 

Se questo viene fatto uso a voi, the source is here.

1

È possibile utilizzare la classe ConfigurationManager per accedere agli elementi nel file web.config o app.config. Tuttavia, nella libreria di classi, assicurati di inserire il nome chiave di tutte le impostazioni di appSettings e/o connectionString dal consumatore (preferibilmente nel costruttore). Ciò evita il problema della scelta di un nome chiave che il consumatore sta già utilizzando altrove.

Problemi correlati