0

純粋な POCO ドメイン オブジェクトを維持するために FluentNHibernate.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/trollock/Fluent-NHibernate-Search/wikiは、次のような FluentSearch 構成を作成する必要があると述べています。

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

最後に、FluentNHibernate の上に NHibernate.Search を構成します。

しかし、「nhcfg」構成を NHibernateSession.Init に接続するにはどうすればよいですか? NHibernateSession.Init と FluentHibernate.Search には互換性のないインターフェースがあるようです。

SharpArchitecture アプリの NHibernate.Search を FluentHibernate.Search マッピングと統合する方法はありますか?

4

1 に答える 1

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);
于 2012-04-16T04:03:36.580 に答える