Hola Gente,
En este post implementaremos una clase que administre secciones de configuración personalizadas en el web.config.
Escenario:
Sucede que mi aplicación tiene una parte de los archivos de mapeo(hbm) incrustados y otra parte en una carpeta, esto debido a que los que están en la carpeta contienen consultas nombradas y es un requerimiento personalizar y cambiar esas consultas nombradas sin necesidad de un re-build a la aplicación.
Ahora mediante el BuildSessionFactory() se cargan automaticamente los archivos de mapeo hbm incrustados y mediante el cfg.AddDirectory(path) cargo los archivos de mapeo que se encuentran dentro de una carpeta.
Lo que estaba haciendo hasta ahora es crear una clave en el registro y colocar la ruta de la carpeta en la clave de registro , luego leer la clave de registro para obtener el carpeta en donde estan los hbm y el archivo de configuracion de NH (hibernate.cfg.xml para mi caso)
Sucede que por "seguridad" se ha decidido cambiar esto
Problema:
Ahora en mi capa de acceso a datos tengo una clase que me administra las sesiones de NH (NhibernateHelper) y obtiene la ruta del archivo de configuracion y ruta de la carpeta de los hbm no incrustados, y construye mis sesiones
a partir de eso.
Lo que se quiere hacer es: Crear una seccion dentro del web.config con dos propiedades, una donde apunte a la ruta de mi archivo de configuracion y otra propiedad donde apunte a mi carpeta que contiene los hbm no
incrustados.
Construyendo:
Clase: NHibernateConfigurationSection
Esta clase hereda de ConfigurationSection y ademas es "No heredable" , su trabajo sera administrar las secciones de configuración que yo cree dentro mi web.config
| Imports System.Configuration Public NotInheritable Class NHibernateConfigurationSection Inherits ConfigurationSection Private Shared _Properties As ConfigurationPropertyCollection Private Shared strHibernateFile As New ConfigurationProperty("HibernateFile", GetType(String), "hibernate.cfg.xml", ConfigurationPropertyOptions.IsRequired) Private Shared strMappingPath As New ConfigurationProperty("MappingPath", GetType(String), "", ConfigurationPropertyOptions.IsRequired) Public Sub New() _Properties = New ConfigurationPropertyCollection() _Properties.Add(strHibernateFile) _Properties.Add(strMappingPath) End Sub Public Shared ReadOnly Property CurrentConfiguration() As NHibernateConfigurationSection Get Return CType(ConfigurationManager.GetSection("nh"), NHibernateConfigurationSection) End Get End Property Protected Overrides ReadOnly Property Properties() As ConfigurationPropertyCollection Get Return _Properties End Get End Property Protected Overrides Function GetRuntimeObject() As Object Return MyBase.GetRuntimeObject() End Function <StringValidator(InvalidCharacters:=" ~!@#$%^&*()[]{}/;'|\", MinLength:=1, MaxLength:=60)> _ Public Property HibernateFile() As String Get Return CStr(Me("HibernateFile")) End Get Set(ByVal value As String) Me("HibernateFile") = value End Set End Property <StringValidator(InvalidCharacters:=" ~!@#$%^&*()[]{};'|", MinLength:=1, MaxLength:=60)> _ Public Property MappingPath() As String Get Return CStr(Me("MappingPath")) End Get Set(ByVal value As String) Me("Mapping") = value End Set End Property End Class |
Ahora en Nuestro NhibernateHelper:
Utilizamos la propiedad estatica "CurrentConfiguration" para obtener una instancia de la clase y muy importante esta propiedad apunta directamente al nombre de la seccion que vamos a crear , para nuestro caso "nh"
| Public Class NHibernateHelper Private Const CurrentSessionKey As String = "nhibernate.current_session" Public Shared SessionFactory As ISessionFactory Shared Sub New() Try Dim cf As NHibernateConfigurationSection = NHibernateConfigurationSection.CurrentConfiguration log4net.Config.XmlConfigurator.Configure() Dim cfg As Configuration = New Configuration cfg.Configure(cf.HibernateFile) Dim path As New DirectoryInfo(CStr(cf.MappingPath)) cfg.AddDirectory(path) SessionFactory = cfg.BuildSessionFactory Catch ex As Exception Throw New Exception("NHibernate initializacion failed", ex) End Try End Sub ... End Class |
En El Web.Config:
| <?xml version="1.0" encoding="utf-8"?><configuration> <configSections> <section name="nh" type="Demo.NHibernateConfigurationSection,Demo" allowDefinition="Everywhere" allowExeDefinition="MachineToApplication" restartOnExternalChanges="true" /> </configSections> ... <nh HibernateFile="C:\Proyectos\demo\hibernate.cfg.xml" MappingPath="C:\Proyectos\demo\Mappings"/> </configuration> |
Y Listo ahora podemos mover nuestro archivo de configuración y nuestra carpeta que contiene los hbm sin mayor problema , solo nos bastara con modifcar la ruta en el tag "nh" y listo¡¡¡
Muchas Gracias , espero les haya servido
PS: Gracias a Sergio Castillo por la ayuda.
