Как можно интегрировать SharpArchitecture и NHibernate.Search через Fluent.NHibernate.Search?

Я пытаюсь использовать NHibernate.Search в приложении SharpArchitecture с сопоставлением FluentNHibernate.Search для поддержки чистых объектов домена POCO.

Но я не знаю, как настроить NHibernateSession:

На моем Global.asax.cs у меня есть эта инициализация и отлично работает:

NHibernateSession.Init(
    this.webSessionStorage,
    new[] { Server.MapPath( "~/bin/MyBlog.Infrastructure.dll" ) },
    new AutoPersistenceModelGenerator().Generate(),
    Server.MapPath( "~/NHibernate.config" ) );

Затем https://github.com/trullock/Fluent-NHibernate-Search/wiki говорит, что мне нужно создать такую ​​конфигурацию FluentSearch:

Configuration nhcfg = FluentSearch.Configure()
    .DefaultAnalyzer().Standard()
    .DirectoryProvider().FSDirectory()
    .IndexBase("~/Index")
    .IndexingStrategy().Event()
    .MappingClass<LibrarySearchMapping>()
    .BuildConfiguration();

И, наконец, настройте NHibernate.Search поверх FluentNHibernate.

Но что я могу сделать, чтобы связать конфигурацию "nhcfg" с NHibernateSession.Init? NHibernateSession.Init и FluentHibernate.Search имеют несовместимые интерфейсы.

Есть ли способ интегрировать NHibernate.Search в приложении SharpArchitecture с сопоставлением FluentHibernate.Search?


person eze1981    schedule 14.04.2012    source источник


Ответы (1)


Решено!

Я заглянул внутрь реализации NHibernateSesssion из SharpArchitecture и извлек заводскую конфигурацию сеанса за пределами метода NHibernateSession.Init. Наконец, я добавил новую конфигурацию, вызывающую метод NHibernateSession.AddConfiguration.

Обратите внимание, что NHibernateSession.Init внутренне регистрирует несколько слушателей:

 c.EventListeners.PreInsertEventListeners = new IPreInsertEventListener[]
                        {
                            new DataAnnotationsEventListener()
                        };
 c.EventListeners.PreUpdateEventListeners = new IPreUpdateEventListener[]
                        {
                            new DataAnnotationsEventListener()
                        };

Проблема в том, что класс DataAnnotationsEventListener является внутренним для SharpArch.NHibernate.dll; поэтому мне нужно продублировать этот класс в моем проекте. Уродливо, но работает.

Наконец, инициализация сеанса NHibernate выглядит так:

        var nhConfig = new Configuration();
        nhConfig.Configure( Server.MapPath( "~/NHibernate.config" ) );

        var cnf = Fluently
            .Configure( nhConfig )
            .Mappings( 
                m =>
                   {
                       var mappingAssembly = Server.MapPath( "~/bin/MyBlog.Infrastructure.dll" );
                       var assembly = Assembly.LoadFrom( MakeLoadReadyAssemblyName( mappingAssembly ) );
                       m.HbmMappings.AddFromAssembly( assembly );
                       m.FluentMappings.AddFromAssembly( assembly ).Conventions.AddAssembly( assembly );

                       m.AutoMappings.Add( new AutoPersistenceModelGenerator().Generate() );                   
                   })
            .ExposeConfiguration( c =>
                {   
                    FluentSearch.Configure( c )
                        .DefaultAnalyzer().Standard()
                        .DirectoryProvider().FSDirectory()
                        .IndexBase( "~/Index" )
                        .IndexingStrategy().Event()
                        .Listeners( FluentNHibernate.Search.Cfg.ListenerConfiguration.Default )
                        .MappingClass<SearchMap>()
                        .BuildConfiguration();

                    c.SetListeners( ListenerType.PostInsert, new[] { new FullTextIndexEventListener() } );
                    c.SetListeners( ListenerType.PostUpdate, new[] { new FullTextIndexEventListener() } );
                    c.SetListeners( ListenerType.PostDelete, new[] { new FullTextIndexEventListener() } );

                    c.SetListener( ListenerType.PostCollectionRecreate, new FullTextIndexCollectionEventListener() );
                    c.SetListener( ListenerType.PostCollectionRemove, new FullTextIndexCollectionEventListener() );
                    c.SetListener( ListenerType.PostCollectionUpdate, new FullTextIndexCollectionEventListener() );

                    /*
                    c.EventListeners.PreInsertEventListeners = new IPreInsertEventListener[]
                        {
                            new DataAnnotationsEventListener()
                        };
                    c.EventListeners.PreUpdateEventListeners = new IPreUpdateEventListener[]
                        {
                            new DataAnnotationsEventListener()
                        };
                   */
                })
            .BuildConfiguration();

        NHibernateSession.Storage = this.webSessionStorage;

        NHibernateSession.AddConfiguration(
            NHibernateSession.DefaultFactoryKey,
            cnf.BuildSessionFactory(),
            cnf,
            null);
person eze1981    schedule 16.04.2012