2012-04-14 5 views
0

J'essaie d'utiliser NHibernate.Search sur une application SharpArchitecture, avec le mappage FluentNHibernate.Search pour gérer les objets de domaine POCO pur.Comment intégrer SharpArchitecture et NHibernate.Search via Fluent.NHibernate.Search?

Mais je ne sais pas comment configurer le NHibernateSession:

Sur mes Global.asax.cs j'ai cette initialisation et fonctionne très bien:

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

Ensuite, https://github.com/trullock/Fluent-NHibernate-Search/wiki dit que je dois créer un config FluentSearch comme ceci:

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

Et enfin configurer NHibernate.Search au-dessus FluentNHibernate. Mais, que puis-je faire pour connecter la config "nhcfg" avec NHibernateSession.Init? NHibernateSession.Init et FluentHibernate.Search semblent avoir des interfaces incompatibles.

Existe-t-il un moyen d'intégrer NHibernate.Search sur une application SharpArchitecture avec le mappage FluentHibernate.Search?

Répondre

2

Résolu!

J'ai analysé l'implémentation NHibernateSesssion de SharpArchitecture et extrait la configuration de la fabrique de session en dehors de la méthode NHibernateSession.Init. Enfin, j'ai ajouté la nouvelle configuration appelant la méthode NHibernateSession.AddConfiguration.

Faites attention que NHibernateSession.Init registre interne des auditeurs:

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

Les problèmes que DataAnnotationsEventListener classe, est interne à SharpArch.NHibernate.dll; donc j'ai besoin de dupliquer cette classe dans mon projet. Laid mais fonctionne.

regard d'initialisation de la session Enfin NHibernate comme ceci:

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