2012-04-14 8 views
0

私は、SharpArchitectureアプリケーションでNHibernate.Search、FluentNHibernate.Searchマッピングを持つ を使用して、純粋なPOCOドメインオブジェクトを維持しようとしています。Fluent.NHibernate.Searchを介してSharpArchitectureと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(); 

そして最後にFluentNHibernateの上NHibernate.Searchを設定します。

しかし、NHibernateSession.Initに "nhcfg" configを接続するにはどうすればよいですか? NHibernateSession.InitとFluentHibernate.Searchは互換性のないインターフェイスを持つように見えます。

FluentHibernate.SearchマッピングでSharpArchitectureアプリケーションでNHibernate.Searchを統合する方法はありますか?

答えて

2

解決済み!

私はSharpArchitectureからNHibernateSesssionの実装を見て、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);