2009-07-13 32 views
11

Vì vậy, tôi thực sự thích làm việc với NHibernate nhưng luôn luôn sử dụng Spring.Net với nó.NHibernate và Bản đồ cấu trúc

Gần đây tôi đã xem qua StructureMap by Jeremy Miller và thực sự thích nó hơn Spring.Net. Trên trang StructureMap của mình, anh ta hứa hẹn một ví dụ về cách sử dụng NHibernate và StructureMap cùng nhau. Thật không may là anh ấy không có thời gian để làm điều đó (hoặc tôi không thể tìm thấy nó).

Vì vậy, có ai có ví dụ về cách xử lý phiên NHibernate với StructureMap không?

+0

cảm thấy như chạm vào điều này, tôi đã chờ đợi ví dụ đó cũng – mxmissile

+0

Được liên kết với http://stackoverflow.com/que stions/383440/using-fluent-nhibernate-with-structuremap-or-any-iocc – Rodrigue

Trả lời

23

Vì vậy, tôi xin lỗi vì chúng tôi đã không nhận được NHibernate với ví dụ StructureMap được thực hiện trước đó. Cuối cùng, tôi muốn xuất bản nó trong tài liệu StructureMap, nhưng trước tiên tôi cần một số phản hồi. Bạn có thể xem toàn bộ ví dụ trên blog của tôi:

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

Điều đó đang được nói, tôi có thể nhấn nổi bật ở đây. Có một NHibernateRegistry mà làm cho có sẵn bốn điều: một NHibernate.Configuration (như một Singleton), một ISessionFactory (như một Singleton), một ISession (phạm vi Hybrid (HttpContext nếu có, rơi trở lại Thread lưu trữ địa phương)), và rất IUnitOfWork đơn giản. Ngoài ra, có một HttpModule để quản lý UnitOfWork cho mỗi yêu cầu web.

Đây là mã cho 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>(); 
     } 
    } 
} 

Đây là mã cho các Đơn vị làm việc:

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

Đây là NHibernateModule cho các ứng dụng 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(); 
     } 
    } 
} 
+1

Nhưng bạn không chặn cơ sở dữ liệu cho toàn bộ yêu cầu với điều này? Tôi có nghĩa là bạn bắt đầu giao dịch sau khi yêu cầu bắt đầu và cam kết sau khi nó kết thúc. – chester89

0
  • Sửa đây: Tôi gửi nhận xét này trước câu trả lời của wbinford đã được đăng. Tôi vẫn nghĩ rằng việc sử dụng NCommon là tốt, nhưng câu trả lời của anh ta ở trên là một chút sạch hơn và không yêu cầu sử dụng một công cụ của bên thứ ba khác.

Tôi thực sự không nhận được câu trả lời mà tôi đang tìm kiếm nhưng tôi đã tìm thấy một khung làm đẹp được gọi là NCommon. Nó thực hiện các đơn vị của mô hình công việc cùng với các mô hình kho lưu trữ với NHibernate, LinqToSql hoặc khung thực thể. Nó cũng xử lý NHibernate ISession cũng như cấu hình cho NHibernate. Tôi đã sử dụng công cụ này với StructureMap và NHibernate. Tôi đã có để có được các adapter dịch vụ cho StructureMap, nhưng một khi thiết lập nó hoạt động khá độc đáo.

+0

Hi dionysus55, Im đang cố gắng cho chúng tôi NCommon với bản đồ cấu trúc và im hoàn toàn bị mất. Bạn có bất kỳ mã mẫu nào cho biết cách thực hiện điều này không? – Todd

+0

Xin lỗi tôi không có gì tôi có thể phát hành. Nếu bạn nhìn vào câu trả lời của wbinford, ông tổng kết quá trình. Các url ông chỉ để giúp là tốt. – dionysus55

Các vấn đề liên quan