所以我真的很喜欢与NHibernate一起工作,但总是使用Spring.Net。NHibernate和结构图
我最近遇到了StructureMap by Jeremy Miller,真的很喜欢它比Spring.Net更好。在他的StructureMap网站上,他承诺一个关于如何一起使用NHibernate和StructureMap的例子。不幸的是,他没有时间去做(或者我找不到它)。
那么,有没有人有如何处理与StructureMap的NHibernate会话的例子?
所以我真的很喜欢与NHibernate一起工作,但总是使用Spring.Net。NHibernate和结构图
我最近遇到了StructureMap by Jeremy Miller,真的很喜欢它比Spring.Net更好。在他的StructureMap网站上,他承诺一个关于如何一起使用NHibernate和StructureMap的例子。不幸的是,他没有时间去做(或者我找不到它)。
那么,有没有人有如何处理与StructureMap的NHibernate会话的例子?
所以,我很抱歉,我们没有得到早期完成的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();
}
}
}
我真的没有得到我正在寻找的答案,但我找到了一个很好的框架,称为NCommon。它使用NHibernate,LinqToSql或Entity Framework实现工作模式单元以及存储库模式。它还处理NHibernate ISession以及NHibernate的配置。我使用了StructureMap和NHibernate的工具。我确实必须获得StructureMap的服务适配器,但一旦设置好,它的工作就会很好。
嗨dionysus55, 我试图给我们NCommon的结构图,我完全失去了。你有任何示例代码显示如何做到这一点? – Todd 2011-02-04 23:15:40
感觉像碰到这个,我一直在等待这个例子 – mxmissile 2009-07-22 16:44:05
链接到http://stackoverflow.com/que stions/383440/using-fluent-nhibernate-with-structuremap-or-any-iocc – Rodrigue 2011-06-08 17:11:34