目前我的存储库有 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/

10-12 06:27