代码之家  ›  专栏  ›  技术社区  ›  dionysus55

NHibernate与结构图

  •  11
  • dionysus55  · 技术社区  · 17 年前

    所以我真的很喜欢和你一起工作 NHibernate

    我最近遇到 StructureMap by Jeremy Miller 而且比Spring.Net更喜欢它。在他的StructureMap网站上,他承诺提供一个如何将NHibernate和StructureMap结合使用的示例。不幸的是,他没有时间做这件事(或者我找不到)。

    那么,有没有人举过如何使用StructureMap处理NHibernate会话的例子?

    3 回复  |  直到 17 年前
        1
  •  23
  •   wbinford    16 年前

    因此,很抱歉,我们没有在前面完成带有StructureMap的NHibernate示例。最后,我想在StructureMap文档中发布它,但我需要一些反馈。您可以在我的博客上看到完整的示例:

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

    也就是说,我可以在这里突出重点。有一个NHibernateRegistry可以提供四种功能:一个NHibernate.Configuration(作为单例)、一个ISessionFactory(作为单例)、一个ISession(作用域混合(HttpContext,如果可用,返回到线程本地存储)),以及一个非常简单的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();
            }
        }
    }
    

    以下是用于web应用程序的NHibernateModule:

    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();
            }
        }
    }
    
        3
  •  0
  •   dionysus55    16 年前
    • 在这里编辑:我在wbinford的答案发布之前发布了这条评论。我仍然认为使用NCommon是好的,但是上面的答案更简洁,不需要使用其他第三方工具。

    NCommon . 它使用NHibernate、LinqToSql或实体框架实现工作单元模式以及存储库模式。它还处理NHibernate会话以及NHibernate的配置。我使用StructureMap和NHibernate工具。我确实需要为StructureMap获取服务适配器,但一旦设置好,它就可以很好地工作。