Как поддерживать несколько источников данных с помощью OpenSessionInView от Spring.NET/NHibernate?

Я нашел несколько советов от Spring.NET + NHibernate - несколько (различных) баз данных с OpenSessionInView, но у меня это не работает, нужна ваша помощь, чтобы определить, что происходит не так.

мой проект основан на ASP.NET/Spring.NET(OpenSessionInView)/NHibernate, и нам нужно управлять внешней базой данных, поэтому мы хотим поддерживать несколько источников данных в шаблоне OSIV.

что мы сделали по приведенным выше ссылкам:

(1) Создайте подкласс Spring.Data.NHibernate.Support.OpenSessionInViewModule.

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

(2) Настройте OSIV в web.config

вот мои конфигурации для интеграции Spring.NET и 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>

Когда мы запускали его, система говорит:

No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here

мы обнаружили, что SessionFactoryObject в любом объекте Repository имеет значение null.

логи были такие:

2012-09-13 10:29:19,017 [13] DEBUG MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - Trying to close SessionScope
2012-09-13 10:29:19,018 [13] DEBUG MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - Only participated Hibernate Session - doing nothing
2012-09-13 10:29:19,030 [13] DEBUG MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - Participating in existing Hibernate SessionFactory
2012-09-13 10:29:19,033 [14] DEBUG MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - Participating in existing Hibernate SessionFactory
2012-09-13 10:29:19,043 [13] DEBUG MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - Trying to close SessionScope
2012-09-13 10:29:19,055 [14] DEBUG MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - Trying to close SessionScope
2012-09-13 10:29:19,062 [13] DEBUG MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - Only participated Hibernate Session - doing nothing
2012-09-13 10:29:19,071 [14] DEBUG MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - Only participated Hibernate Session - doing nothing
2012-09-13 10:29:19,117 [13] DEBUG MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - Participating in existing Hibernate SessionFactory
2012-09-13 10:29:19,122 [13] DEBUG MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - Trying to close SessionScope
2012-09-13 10:29:19,126 [13] DEBUG MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - Only participated Hibernate Session - doing nothing
2012-09-13 10:29:19,130 [13] DEBUG MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - Participating in existing Hibernate SessionFactory
2012-09-13 10:29:19,132 [13] DEBUG MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - Trying to close SessionScope
2012-09-13 10:29:19,132 [13] DEBUG MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - Only participated Hibernate Session - doing nothing
2012-09-13 10:29:21,347 [14] DEBUG MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - Participating in existing Hibernate SessionFactory
2012-09-13 10:29:21,441 [14] INFO  Spring.Aop.Framework.AutoProxy.InfrastructureAdvisorAutoProxyCreator [(null)] - Candidate advisor [ObjectFactoryTransactionAttributeSourceAdvisor: advice object 'Spring.Transaction.Interceptor.TransactionInterceptor#0'] rejected for targetType [ASP.pages_sysmgmt_debug_aspx]
2012-09-13 10:29:21,457 [14] DEBUG MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - Trying to close SessionScope
2012-09-13 10:29:21,458 [14] DEBUG MyProject.Infrastructure.NHibernate.ExtDbOpenSessionInViewModule [(null)] - Only participated Hibernate Session - doing nothing

Ой! мы действительно застряли в нем.


person Michael Wang    schedule 13.09.2012    source источник
comment
Этот вопрос и ответы может быть полезен .   -  person Marijn    schedule 13.09.2012


Ответы (1)


Задав вопрос, на который вы ссылаетесь, и используя основанное на нем решение более 2 лет, я, возможно, смогу вам помочь.

Хотя это и не идеально, вместо подкласса OpenSessionInViewModule вам нужно скопировать его из источника Spring.NET. При этом убедитесь, что вы внесли одно изменение в конструктор по умолчанию. Это будет выглядеть примерно так:

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

Тип второго параметра для вызова базового класса должен быть вашим вновь скопированным классом, например:

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

Кроме этого, все остальное в вашем вопросе кажется правильным. Дайте мне знать, как это происходит.

person Simon Rice    schedule 17.09.2012