2012-04-14 9 views
0

Ich versuche NHibernate.Search auf einer SharpArchitecture App, mit FluentNHibernate.Search Mapping zu reinen POCO-Domain-Objekte zu pflegen.Wie kann SharpArchitecture und NHibernate.Search über Fluent.NHibernate.Search integriert werden?

Aber ich weiß nicht, wie Setup die NHibernateSession:

Auf meinem Global.asax.cs ich habe diese Initialisierung und funktioniert gut:

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

Dann sagt https://github.com/trullock/Fluent-NHibernate-Search/wiki dass ich brauche eine erstellen FluentSearch Config wie folgt aus:

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

Und schließlich NHibernate.Search oben auf FluentNHibernate konfigurieren.

Aber was kann ich tun, um "nhcfg" config mit NHibernateSession.Init zu verbinden? NHibernateSession.Init und FluentHibernate.Search scheinen inkompatible Schnittstellen zu haben.

Gibt es eine Möglichkeit, NHibernate.Search auf einer SharpArchitecture App mit FluentHibernate.Search Mapping zu integrieren?

Antwort

2

Gelöst!

Ich habe NHibernateSession-Implementierung von SharpArchitecture untersucht und die Konfiguration der Sitzungsfactory außerhalb der NHibernateSession.Init-Methode extrahiert. Schließlich habe ich die neue Konfiguration hinzugefügt, die die NHibernateSession.AddConfiguration-Methode aufruft.

Darauf achten, dass NHibernateSession.Init intern einige Zuhörer registrieren:

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

Die Probleme ist, dass DataAnnotationsEventListener Klasse, zu SharpArch.NHibernate.dll intern ist; also muss ich diese Klasse in meinem Projekt kopieren. Hässlich aber funktioniert.

Schließlich NHibernate Sitzung Initialisierung sieht wie folgt aus:

 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);