gpt4 book ai didi

NHibernate 和结构图

转载 作者:行者123 更新时间:2023-12-04 01:39:02 25 4
gpt4 key购买 nike

所以我真的很喜欢和 NHibernate 一起工作但总是使用 Spring.Net。

我最近遇到了 StructureMap by Jeremy Miller并且真的比 Spring.Net 更喜欢它。在他的 StructureMap 站点上,他 promise 提供一个关于如何一起使用 NHibernate 和 StructureMap 的示例。不幸的是,他没有时间去做(或者我找不到)。

那么有人有关于如何使用 StructureMap 处理 NHibernate session 的示例吗?

最佳答案

所以,我很抱歉我们没有更早完成带有 StructureMap 的 NHibernate 示例。最后,我想在 StructureMap 文档中发布它,但我首先需要一些反馈。你可以在我的博客上看到完整的例子:

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

话虽如此,我可以在这里找到亮点。有一个 NHibernateRegistry 可以提供四件事:一个 NHibernate.Configuration(作为单例)、一个 ISessionFactory(作为单例)、一个 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();
}
}
}

这是用于 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();
}
}
}

关于NHibernate 和结构图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1122339/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com