如何通过Fluent.NHibernate.Search集成SharpArchitecture和NHibernate.Search?

时间:2012-04-14 23:48:14

标签: nhibernate s#arp-architecture nhibernate.search

我正在尝试在SharpArchitecture应用上使用NHibernate.Search, 使用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();

最后在FluentNHibernate上配置NHibernate.Search。

但是,如何将“nhcfg”配置与NHibernateSession.Init连接? NHibernateSession.Init和FluentHibernate.Search似乎有不兼容的接口。

有没有办法在带有FluentHibernate.Search映射的SharpArchitecture应用程序上集成NHibernate.Search?

1 个答案:

答案 0 :(得分: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);