2012-04-14 5 views
0

Я пытаюсь использовать NHibernate.Search в приложении SharpArchitecture, с FluentNHibernate.Search, чтобы поддерживать чистые объекты домена POCO.Как интегрировать SharpArchitecture и NHibernate.Поиск через Fluent.NHibernate.Search?

Но я не знаю, как настроить 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.Поиск в приложение SharpArchitecture с FluentHibernate.Search mapping?

ответ

2

Решенный!

Я заглянул в реализацию 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);