我想解决的问题是在IXyzRepositories之间共享一个ISessionProvider (其中ISessionProvider保存当前的NHibernate ISession)。
我正在调整NHibernate 3 Cookbook的“为每个演示者设置会话”的方法,并希望保留StructureMap (brownfield项目)。
发布于 2011-03-04 06:16:54
我认为你必须创建一个自定义的生命周期来做到这一点,尽管我不确定你到底想要实现什么……
要创建自定义生命周期,您只需实现ILifecycle接口并在注册中使用它。下面是一个您可以查看的示例:http://blog.mikeobrien.net/2010/01/creating-structuremap-lifecycle-for-wcf.html。
发布于 2011-03-04 17:40:03
在web应用程序中,我对sessionFactory使用单例,对会话使用HybridHttpOrThreadLocalScoped:这是我的结构映射注册表:
public class NhibernateRegistry: Registry
{
public NhibernateRegistry()
{
For<ISessionFactory>()
.Singleton()
.Use(new NHibernateSessionFactory(connectionString).SessionFactory);
For<ISession>()
.HybridHttpOrThreadLocalScoped()
.Use(o => o.GetInstance<ISessionFactory>().CurrentSession);
}
}我的NHibernateSessionFactory类似于书中使用的SessionProvider类。所有内容都在请求的末尾处理(web应用程序):
protected void Application_EndRequest(object sender, EventArgs e)
{
ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();
}我使用通用存储库:
public class GenericRepository<T> : IGenericRepository<T> where T : class
{
private readonly ISession _session;
public GenericRepository(ISession session)
{
_session = session;
}
public T Load(Guid Code)
{
return (_session.Load<T>(Code));
}
}但您可以使用自己的实现轻松地更改它。我在这里注册存储库:
public class RepositoriesRegistry : Registry
{
public RepositoriesRegistry()
{
For <Data.IRepository<Domain.Reminder, Guid>>()
.HybridHttpOrThreadLocalScoped()
.Use<Data.NH.Repository<Domain.Reminder, Guid>>();
}
}https://stackoverflow.com/questions/5179121
复制相似问题