¿Cómo admitir múltiples fuentes de datos con OpenSessionInView de Spring.NET/NHibernate?

Encontré un consejo de Spring.NET + NHibernate: múltiples bases de datos (distintas) con OpenSessionInView, pero no funciona para mí, necesito su ayuda para identificar qué está mal.

mi proyecto se basa en ASP.NET/Spring.NET(OpenSessionInView)/NHibernate, y necesitamos manipular una base de datos externa, por lo que queremos admitir múltiples fuentes de datos en el patrón OSIV.

lo que hemos hecho por ref los enlaces anteriores:

(1) Cree una subclase de Spring.Data.NHibernate.Support.OpenSessionInViewModule

namespace MyProject.Infrastructure.NHibernate
{
    public class ExtDbOpenSessionInViewModule : OpenSessionInViewModule
    {
    }
}

(2) Configurar el OSIV en web.config

aquí están mis configuraciones para la integración de Spring.NET y NHibernate:

<!-- Spring Web Support and OSIV for NHibernate -->
<add name="Spring" type="Spring.Context.Support.WebSupportModule, Spring.Web"/>
<add name="OpenSessionInViewOnLocalDb" type="Spring.Data.NHibernate.Support.OpenSessionInViewModule, Spring.Data.NHibernate32"/>
<add name="OpenSessionInViewOnExtDb" type="MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule, MyProject.Infrastructure"/>

<!-- NHibernate SessionFactory in OSIV-->
<appSettings>
    <add key="Spring.Data.NHibernate.Support.OpenSessionInViewModule.SessionFactoryObjectName" value="LocalDbSessionFactory"/>
    <add key="MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule.SessionFactoryObjectName" value="ExtDbSessionFactory"/>
</appSettings>

Cuando lo estábamos ejecutando, el sistema dice:

No hay sesión de Hibernate vinculada al hilo, y la configuración no permite la creación de una no transaccional aquí

encontramos que SessionFactoryObject en cualquier objeto del Repositorio es nulo.

los registros eran como estos:

2012-09-13 10:29:19,017 [13] DEBUG MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - Intentando cerrar SessionScope 2012-09-13 10:29:19,018 [13] DEBUG MyProject.Infrastructure.NHibernate .ExtDbOpenSessionInViewModule [(null)]: solo participó en la sesión de Hibernate: no hizo nada 2012-09-13 10:29:19,030 [13] DEBUG MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)]: participó en Hibernate SessionFactory 2012-09 existente -13 10:29:19,033 [14] DEBUG MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - Participando en Hibernate SessionFactory existente 2012-09-13 10:29:19,043 [13] DEBUG MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - Intentando cerrar SessionScope 2012-09-13 10:29:19,055 [14] DEBUG MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - Intentando cerrar SessionScope 2012-09-13 10:29: 19,062 [13] DEPURAR MiProyecto.Infraestructura.NHibernate.ExtDbOpenSessionInView Módulo [(null)] - Solo participó en la sesión de Hibernate - sin hacer nada 2012-09-13 10:29:19,071 [14] DEBUG MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - Solo participó en la sesión de Hibernate - sin hacer nada 2012- 09-13 10:29:19,117 [13] DEBUG MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - Participando en Hibernate SessionFactory existente 2012-09-13 10:29:19,122 [13] DEBUG MyProject.Infrastructure.NHibernate. ExtDbOpenSessionInViewModule [(null)] - Tratando de cerrar SessionScope 2012-09-13 10:29:19,126 [13] DEBUG MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - Solo participó en la sesión de Hibernate - sin hacer nada 2012-09-13 10:29:19,130 ​​[13] DEBUG MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - Participando en Hibernate SessionFactory existente 2012-09-13 10:29:19,132 [13] DEBUG MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [( null)] - Intentando cerrar SessionScope 2012-09-13 10:29:19,132 [13] DEBUG MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - Solo participó en la sesión de Hibernate - sin hacer nada 2012-09-13 10:29:21,347 [14] DEBUG MyProject. Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - Participando en Hibernate SessionFactory existente 2012-09-13 10:29:21,441 [14] INFO Spring.Aop.Framework.AutoProxy.InfrastructureAdvisorAutoProxyCreator [(null)] - Asesor de candidatos [ObjectFactoryTransactionAttributeSourceAdvisor: objeto de aviso 'Spring.Transaction.Interceptor.TransactionInterceptor#0'] rechazado para targetType [ASP.pages_sysmgmt_debug_aspx] 2012-09-13 10:29:21,457 [14] DEBUG MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - Intentando para cerrar SessionScope 2012-09-13 10:29:21,458 [14] DEBUG MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - Solo participó en la sesión de Hibernate - sin hacer nada

¡Ups! estamos realmente atrapados por eso.

preguntado el 13 de septiembre de 12 a las 06:09

Este planteamiento de « preguntas y respuestas podría ser de ayuda. -

1 Respuestas

Después de hacer la pregunta a la que se refiere y haber usado una solución basada en ella durante más de 2 años, es posible que pueda ayudarlo.

Si bien no es ideal, en lugar de subclase OpenSessionInViewModule, tendrás que copiarlo de la fuente de Spring.NET. Al hacer esto, asegúrese de realizar una modificación en el constructor predeterminado. Se verá algo como esto:

public MyOpenSessionInViewModule() : 
       base("appSettings", typeof(OpenSessionInViewModule), false)

El tipo en el segundo parámetro de la llamada en la clase base debe ser su clase recién copiada, por ejemplo:

public MyOpenSessionInViewModule() : 
       base("appSettings", typeof(MyOpenSessionInViewModule), false)

Aparte de eso, todo lo demás en su pregunta parece ser correcto. Déjame saber cómo va esto.

Respondido el 17 de Septiembre de 12 a las 12:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.