2009-07-13 16 views
11

所以我真的很喜歡與NHibernate一起工作,但總是使用Spring.Net。NHibernate和結構圖

我最近遇到了StructureMap by Jeremy Miller,真的很喜歡它比Spring.Net更好。在他的StructureMap網站上,他承諾一個關於如何一起使用NHibernate和StructureMap的例子。不幸的是,他沒有時間去做(或者我找不到它)。

那麼,有沒有人有如何處理與StructureMap的NHibernate會話的例子?

+0

感覺像碰到這個,我一直在等待這個例子 – mxmissile 2009-07-22 16:44:05

+0

鏈接到http://stackoverflow.com/que stions/383440/using-fluent-nhibernate-with-structuremap-or-any-iocc – Rodrigue 2011-06-08 17:11:34

回答

23

所以,我很抱歉,我們沒有得到早期完成的StructureMap示例的NHibernate。最後,我想將它發佈在StructureMap文檔中,但我首先需要一些反饋。你可以看到在我的博客的完整的例子:

http://trason.net/journal/2009/10/7/bootstrapping-nhibernate-with-structuremap.html

話雖這麼說,我可以在這裏打的亮點。有一個NHibernateRegistry可以提供四種東西:一個NHibernate.Configuration(作爲Singleton),一個ISessionFactory(作爲一個Singleton),一個ISession(範圍混合(HttpContext,如果可用,回退到Thread本地存儲)),還有一個簡單的IUnitOfWork。此外,還有一個HttpModule來管理每個Web請求的UnitOfWork。

下面是NHibernateRegistry代碼:

using NHibernate; 
using NHibernate.ByteCode.Castle; 
using NHibernate.Cfg; 
using NHibernate.Dialect; 
using NHibernate.Driver; 
using NHibernateBootstrap.Core.Domain; 
using StructureMap.Attributes; 
using StructureMap.Configuration.DSL; 
using Environment=NHibernate.Cfg.Environment; 

namespace NHibernateBootstrap.Core.Persistence 
{ 
    public class NHibernateRegistry : Registry 
    { 
     public NHibernateRegistry() 
     { 
      var cfg = new Configuration() 
       .SetProperty(Environment.ReleaseConnections, "on_close") 
       .SetProperty(Environment.Dialect, typeof(SQLiteDialect).AssemblyQualifiedName) 
       .SetProperty(Environment.ConnectionDriver, typeof(SQLite20Driver).AssemblyQualifiedName) 
       .SetProperty(Environment.ConnectionString, "data source=bootstrap.sqlite;Version=3") 
       .SetProperty(Environment.ProxyFactoryFactoryClass, typeof(ProxyFactoryFactory).AssemblyQualifiedName) 
       .AddAssembly(typeof(Blog).Assembly); 

      var sessionFactory = cfg.BuildSessionFactory(); 

      ForRequestedType<Configuration>().AsSingletons().TheDefault.IsThis(cfg); 

      ForRequestedType<ISessionFactory>().AsSingletons() 
       .TheDefault.IsThis(sessionFactory); 

      ForRequestedType<ISession>().CacheBy(InstanceScope.Hybrid) 
       .TheDefault.Is.ConstructedBy(ctx => ctx.GetInstance<ISessionFactory>().OpenSession()); 

      ForRequestedType<IUnitOfWork>().CacheBy(InstanceScope.Hybrid) 
       .TheDefaultIsConcreteType<UnitOfWork>(); 

       ForRequestedType<IDatabaseBuilder>().TheDefaultIsConcreteType<DatabaseBuilder>(); 
     } 
    } 
} 

這裏是工作的單位代碼:

using System; 
using NHibernate; 

namespace NHibernateBootstrap.Core.Persistence 
{ 
    public interface IUnitOfWork : IDisposable 
    { 
     ISession CurrentSession { get; } 
     void Commit(); 
    } 
} 

using NHibernate; 

namespace NHibernateBootstrap.Core.Persistence 
{ 
    public class UnitOfWork : IUnitOfWork 
    { 
     private readonly ISessionFactory _sessionFactory; 
     private readonly ITransaction _transaction; 

     public UnitOfWork(ISessionFactory sessionFactory) 
     { 
      _sessionFactory = sessionFactory; 
      CurrentSession = _sessionFactory.OpenSession(); 
      _transaction = CurrentSession.BeginTransaction(); 
     } 

     public ISession CurrentSession { get; private set;} 

     public void Dispose() 
     { 
      CurrentSession.Close(); 
      CurrentSession = null; 
     } 

     public void Commit() 
     { 
      _transaction.Commit(); 
     } 
    } 
} 

這裏是NHibernateModule爲Web應用程序:

using System; 
using System.Web; 
using NHibernateBootstrap.Core.Persistence; 
using StructureMap; 

namespace NHibernateBootstrap.Web 
{ 
    public class NHibernateModule : IHttpModule 
    { 
     private IUnitOfWork _unitOfWork; 

     public void Init(HttpApplication context) 
     { 
      context.BeginRequest += ContextBeginRequest; 
      context.EndRequest += ContextEndRequest; 
     } 

     private void ContextBeginRequest(object sender, EventArgs e) 
     { 
      _unitOfWork = ObjectFactory.GetInstance<IUnitOfWork>(); 

     } 

     private void ContextEndRequest(object sender, EventArgs e) 
     { 
      Dispose(); 
     } 

     public void Dispose() 
     { 
      _unitOfWork.Dispose(); 
     } 
    } 
} 
0
  • 編輯:我張貼此評論wbinford的答案被張貼之前。我仍然認爲使用NCommon是很好的,但是他的回答稍微清晰一些,不需要使用其他第三方工具。

我真的沒有得到我正在尋找的答案,但我找到了一個很好的框架,稱爲NCommon。它使用NHibernate,LinqToSql或Entity Framework實現工作模式單元以及存儲庫模式。它還處理NHibernate ISession以及NHibernate的配置。我使用了StructureMap和NHibernate的工具。我確實必須獲得StructureMap的服務適配器,但一旦設置好,它的工作就會很好。

+0

嗨dionysus55, 我試圖給我們NCommon的結構圖,我完全失去了。你有任何示例代碼顯示如何做到這一點? – Todd 2011-02-04 23:15:40