gpt4 book ai didi

休眠 : Repository Session Management

转载 作者:行者123 更新时间:2023-12-03 11:50:37 24 4
gpt4 key购买 nike

目前我的存储库有 2 个构造函数。当我从我的 mvc 网站调用这些时,我总是调用第一个构造函数,从而打开一个新 session 。我应该在 session 中通过吗?我该怎么做。

    public CompanyRepository()
{
_session = NHibernateHelper.OpenSession();
}

public CompanyRepository(ISession session)
{
_session = session;
}




public class NHibernateHelper
{
private static ISessionFactory _sessionFactory;

private static ISessionFactory SessionFactory
{
get
{
if (_sessionFactory == null)
{
var configuration = new Configuration();
configuration.Configure();
configuration.AddAssembly(typeof(UserProfile).Assembly);
configuration.SetProperty(NHibernate.Cfg.Environment.ConnectionStringName,
System.Environment.MachineName);
_sessionFactory = configuration.BuildSessionFactory();
}
return _sessionFactory;
}
}

public static ISession OpenSession()
{
return SessionFactory.OpenSession();
}
}

我正在使用 Ninject IOC 容器(对我来说很新)。我有以下容器。我如何将 ISession 绑定(bind)到 CompanyRepository。
 private class EStoreDependencies : NinjectModule
{
public override void Load()
{
Bind<ICompanyRepository>().To<CompanyRepository>();
Bind<IUserProfileRepository>().To<UserProfileRepository>();
Bind<IAddressRepository>().To<AddressRepository>();
Bind<IRolesService>().To<AspNetRoleProviderWrapper>();
Bind<IUserService>().To<AspNetMembershipProviderWrapper>();
Bind<ICurrentUserSerivce>().To<DefaultCurrentUserSerivce>();
Bind<IPasswordService>().To<AspNetMembershipProviderWrapper>();
Bind<IStatusResponseRepository>().To<StatusResponseRepository>();
Bind<ICategoryRepository>().To<CategoryRepository>();
Bind<IProductRepository>().To<ProductRepository>();
}
}

最佳答案

您应该使用“每个请求一个 session ”模式,将 ISession 对象存储在 HttpContext 中并在存储库和在同一 HTTP 请求期间进行的查询之间共享它。

这是 implementation using MVC action attributes .

一个简单/基本的实现也可以通过简单地改变你的 NHibernateHelper 类来实现,如下所示:

public class NHibernateHelper {
//...

const string SessionKey = "NhibernateSessionPerRequest";

public static ISession OpenSession(){
var context = HttpContext.Current;

if(context != null && context.Items.ContainsKey(SessionKey)){
//Return already open ISession
return (ISession)context.Items[SessionKey];
}
else{
//Create new ISession and store in HttpContext
var newSession = SessionFactory.OpenSession();
if(context != null)
context.Items[SessionKey] = newSession;

return newSession;
}
}
}

代码既没有被编译也没有测试......但是应该可以工作。

关于休眠 : Repository Session Management,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2973014/

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