2011-10-04 14 views
11

Busco una buena manera de lograr lo siguiente:¿Tiene acceso a web.config desde una biblioteca de clases separada?

He una aplicación web (MVC 3), con una biblioteca de clases independiente que contiene la lógica de fondo de un CMS que estoy haciendo. Este CMS usa NHibernate para conectarse a una base de datos. Quiero que el usuario pueda configurar la conexión de cadena (y eventualmente incluso el sabor de la base de datos) en su archivo web.config.

Lo que estoy buscando es una buena forma de obtener la cadena de conexión del archivo web.config, aunque la DLL esté completamente separada. es posible? ¿Tendré que pasar mi cadena de conexión a la biblioteca de mi clase de alguna manera? ¿O podré acceder a él cuando se ejecute la aplicación?

Si tengo que crear un código en mi aplicación web para pasar la cadena de conexión a mi Biblioteca de clases, ¿cómo puedo hacer que este código sea tan portátil como sea posible, así que no tendré que escribirlo nuevamente para mi siguiente aplicación web ?

Muchas gracias por cualquier idea que tenga.

Respuesta

17

Puede pasar la cadena de conexión a las clases en la biblioteca de clases del sitio web.

Esta es una mejor opción que tratar de obtener la información directamente del archivo de configuración, ya que de lo contrario dependerá del archivo de configuración existente con la tecla correcta (lo que dificulta la prueba de la clase).

Consulte this blog post para obtener argumentos contra el acceso a la configuración directamente (lo cual se hace muy comúnmente, pero no es la mejor práctica).

+0

+1 para pruebas de aceleración. Separar la obtención de la configuración del uso de ella – SHug

8

Puede acceder al System.Configuration.ConfigurationManager desde la biblioteca de su clase. Eso te dará acceso a AppSettings y ConnectionStrings.

+3

Mala idea. La configuración es una dependencia y se debe pasar directamente. http://www.devtrends.co.uk/blog/configuration-settings-are-a-dependency-that-should-be-injected – Oded

+2

@Oded: implementar una interfaz no es menos molesto que agregar elementos a una aplicación .config. También evita varias características de seguridad integradas en el administrador de configuración .net, como la capacidad de encriptar cadenas de conexión y el hecho de que la aplicación no puede modificar web.config. Sin mencionar que todos los que usen su biblioteca también tendrán que aprender una nueva forma de configurar las cosas en lugar de utilizar un estándar de la industria. –

+0

@CharlesLambert: el hecho de que sea una técnica ampliamente utilizada no lo convierte en un buen hábito. Si prueba su capa de acceso a datos, lo obliga a agregar archivos de configuración a los conjuntos de prueba. – Oded

0

Dado que está utilizando la biblioteca de clases para la aplicación web MVC, también es accesible para la biblioteca de clases. No se necesitan configuraciones adicionales. A pesar de que la biblioteca de clases cuando se construyó dio un dll por separado, se hace referencia en el proyecto actual. Entonces la cadena de conexión estará disponible para la biblioteca de clase también.

0

Iría con algo así como Autofac para darle una implementación de IoC que pueda almacenar una interfaz de configuración para las cadenas de conexión. Esto le permitiría configurar el valor desde web.config en el inicio de la aplicación, o establecerlo dentro de las pruebas con un valor diferente sin que su biblioteca de clases tenga que estar acoplada a un web.config.

1

Tengo exactamente la misma configuración que con un proyecto de FOSS con el que estoy involucrado. Contiene todo (incluso los Controladores y Global.asax.cs) en la biblioteca de la clase 'Core'.

Hay un montón de soluciones válidas, el que yo opté por era crear una clase de configuración que es esencialmente un conjunto de propiedades estáticas, dentro de la cual tiene:

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

Nota: asegúrese de que su biblioteca de clases tiene System.Configuration agregado como referencia.

Dentro de su aplicación (la clase derivada de HttpApplication) se pasa la configuración de ancho, aunque no hay nada que le impida tighly el acoplamiento de la configuración NH con la clase de configuración:

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

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

Si esto es todo uso para usted, the source is here.

1

Puede utilizar la clase ConfigurationManager para acceder a los elementos en su archivo web.config o app.config. Sin embargo, en su biblioteca de clase, asegúrese de incluir el nombre de la clave de cualquier configuración de AppSettings y/o connectionString del consumidor (preferiblemente en el constructor). Esto evita el problema de que elija un nombre de clave que el consumidor ya esté utilizando en otro lugar.

Cuestiones relacionadas