我怎样才能解决这个问题?我想注入一个nhibernate会话,但该会话尚未创建

我怎样才能解决这个问题?我想注入一个nhibernate会话,但该会话尚未创建,nhibernate,dependency-injection,repository-pattern,ninject,global-asax,Nhibernate,Dependency Injection,Repository Pattern,Ninject,Global Asax,编辑 我想尝试做Remo Gloor建议的事情 为使用OnApplicationStarted中的代码重新运行SessionFactory的提供程序创建派生的SessionFactoryProvider 使用新的提供程序为SessionFactory创建绑定,并将其放入SingletonScope中 创建从提供程序派生的SessionProvider,该提供程序在构造函数中注入SessionFactory,并使用工厂的GetCurrentSession重新启动新会话。 为ISession创建一个

编辑

我想尝试做Remo Gloor建议的事情

为使用OnApplicationStarted中的代码重新运行SessionFactory的提供程序创建派生的SessionFactoryProvider 使用新的提供程序为SessionFactory创建绑定,并将其放入SingletonScope中 创建从提供程序派生的SessionProvider,该提供程序在构造函数中注入SessionFactory,并使用工厂的GetCurrentSession重新启动新会话。 为ISession创建一个绑定,该绑定使用激活和停用操作打开、传输、回滚和关闭会话,基本上是应用程序_BeginRequest、EndRequest中的代码。将绑定标记为请求范围中的绑定。 删除应用程序_BeginRequest,EndRequest。 使用Bind.To绑定回购协议; 我正在寻找一个教程,点击这些点与一个文件,我可以下载和发挥周围。如果它使用了大量的泛型,你需要非常详细,因为泛型仍然会吸引我

我正在尝试使用我的nhibernate按请求进行会话

我在我的global.aspx中这样做了

using System;
using System.Web.Mvc;
using System.Web.Routing;
using Demo.WebUI.Models.NinjectModules;
using FluentNHibernate.Cfg;
using FluentNHibernate.Cfg.Db;
using NHibernate;
using NHibernate.Context;
using Ninject;
using Ninject.Modules;
using Ninject.Web.Mvc;


namespace Demo.WebUI
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801

    public class MvcApplication : NinjectHttpApplication
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new {controller = "Account", action = "Login", id = UrlParameter.Optional} // Parameter defaults
                );
        }

        public static ISessionFactory SessionFactory { get; private set; }

        protected override void OnApplicationStarted()
        {
            AreaRegistration.RegisterAllAreas();
            RegisterRoutes(RouteTable.Routes);

            SessionFactory = Fluently.Configure()
                .Database(MsSqlConfiguration.MsSql2008.ConnectionString(c => c.FromConnectionStringWithKey("test")))
                .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Demo.Framework.Data.NhibernateMapping.UserMap>())
                .ExposeConfiguration(x => x.SetProperty("current_session_context_class", "web"))
                .ExposeConfiguration(BuidSchema)
                .BuildSessionFactory();
        }


        protected void Application_BeginRequest(object sender, EventArgs e)
        {
            ISession session = SessionFactory.OpenSession();
            session.BeginTransaction();
            CurrentSessionContext.Bind(session);
        }

        protected void Application_EndRequest(object sender, EventArgs e)
        {
            ISession session = CurrentSessionContext.Unbind(SessionFactory);

            if (session != null)
            {
                try
                {
                    session.Transaction.Commit();
                }
                catch (Exception)
                {
                    session.Transaction.Rollback();
                }
                finally
                {
                    session.Close();
                    session.Dispose();
                }
            }
        }


        protected override IKernel CreateKernel()
        {
            var modules = new INinjectModule[]
                              {
                                  new ServiceModule(),
                                  new RepoModule()
                              };

            return new StandardKernel(modules);
        }

        private static void BuidSchema(NHibernate.Cfg.Configuration config)
        {
            new NHibernate.Tool.hbm2ddl.SchemaExport(config).Create(false, true);
        }
    }
}
在我的单元中,我有

Bind<IUserRepo>().To<UserRepo>().WithConstructorArgument("session",MvcApplication.SessionFactory.GetCurrentSession());
这将引发一个错误,因为ninject将在OnApplicationStarted启动之前和Application_开始绑定之前创建内核

那我该怎么办

编辑

这是我在一些教程中发现的

  public static ISessionFactory SessionFactory { get; private set; }

        public MvcApplication()
        {
            SessionFactory = CreateSessionFactory();
        }

        private static ISessionFactory CreateSessionFactory()
        {
            return Fluently.Configure()
            .Database(MsSqlConfiguration.MsSql2008.ConnectionString(c => c.FromConnectionStringWithKey("test")))
            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Demo.Framework.Data.NhibernateMapping.UserMap>())
            .ExposeConfiguration(x => x.SetProperty("current_session_context_class", "web"))
            .ExposeConfiguration(BuidSchema)
            .BuildSessionFactory();
        }
我的装订

  Bind<IUserRepo>().To<UserRepo>();
    Bind<ISession>().ToMethod(x => MvcApplication.SessionFactory.GetCurrentSession());
因此,我首先在构造函数加载时创建会话工厂,然后将其绑定到Isession,而不是将其作为参数传入


对于全局aspx,我唯一不确定的是,它是否会每次都调用构造函数并重新创建SessionFactory,这是不好的。因此,我不确定是否需要首先检查它是否存在。

将SessionFactory初始化代码包装在一个单例中,当您访问SessionFactory上的Instance属性时,它将初始化和配置SessionFactory一次。在BeginRequest中使用此选项,而不是在当前代码中使用此选项。

将SessionFactory初始化代码包装在一个单例中,当您访问SessionFactory上的Instance属性时,该代码将初始化和配置SessionFactory一次。在BeginRequest中使用此选项,而不是在当前代码中使用。

如果使用的是当前会话上下文,则不必插入会话

改为注入SessionFactory,然后使用GetCurrentSession获取ISession


更改后,您可以使用Felice的解决方案。

如果您使用的是当前会话上下文,则不必注入会话

改为注入SessionFactory,然后使用GetCurrentSession获取ISession


更改后,您可以使用Felice的解决方案。

您的实现很好,但不是一个好的解决方案,因为您需要手动控制会话生命周期。实际的做法是让Ninject决定会话的创建、打开、关闭和释放时间

例如,想象你不需要任何训练的动作。或者是一个更大的项目,其中有多个数据库和会话来分担负载。在这些情况下,您不希望为每个操作创建所有可能的会话,因为这意味着可以避免开销。您更希望只创建当前操作所需的那些

为此,需要进行几项更改:

为使用OnApplicationStarted中的代码重新运行SessionFactory的提供程序创建派生的SessionFactoryProvider 使用新的提供程序为SessionFactory创建绑定,并将其放入SingletonScope中 创建从提供程序派生的SessionProvider,该提供程序在构造函数中注入SessionFactory,并使用工厂的GetCurrentSession重新启动新会话。 为ISession创建一个绑定,该绑定使用激活和停用操作打开、传输、回滚和关闭会话,基本上是应用程序_BeginRequest、EndRequest中的代码。将绑定标记为请求范围中的绑定。 删除应用程序_BeginRequest,EndRequest。 使用Bind.To绑定回购协议;
您的实现很好,但不是一个好的解决方案,因为您需要手动控制会话生命周期。实际的做法是让Ninject决定会话的创建、打开、关闭和释放时间

例如,想象你不需要任何训练的动作。或者是一个更大的项目,其中有多个数据库和会话来分担负载。在这些情况下,您不希望为每个操作创建所有可能的会话,因为这意味着可以避免开销。您更希望只创建当前操作所需的那些

为此,需要进行几项更改:

为使用OnApplicationStarted中的代码重新运行SessionFactory的提供程序创建派生的SessionFactoryProvider 使用新的提供程序为SessionFactory创建绑定,并将其放入SingletonScope中 创建从获取SessionFactory i的提供程序派生的SessionProvider 在构造函数中注册,并使用工厂的GetCurrentSession重新运行新会话。 为ISession创建一个绑定,该绑定使用激活和停用操作打开、传输、回滚和关闭会话,基本上是应用程序_BeginRequest、EndRequest中的代码。将绑定标记为请求范围中的绑定。 删除应用程序_BeginRequest,EndRequest。 使用Bind.To绑定回购协议;
我最近写了一篇关于在asp.NETMVC应用程序中使用nhibernate和存储库模式的博客。本项目提供了一个使用nhibernate和ninject的示例。以下是一些链接:

我认为我们有一个类似的架构。看看这些帖子,如果你有任何问题,请告诉我

顺便说一句,你可以在


Bob

我最近写了一篇关于在asp.net mvc应用程序中使用nhibernate和存储库模式的博客。本项目提供了一个使用nhibernate和ninject的示例。以下是一些链接:

我认为我们有一个类似的架构。看看这些帖子,如果你有任何问题,请告诉我

顺便说一句,你可以在



Bob

将CreateKernel设置为私有并在RegisterRoutes之后调用如何?它不能从Ninject.Web.Mvc.dll继承,因此不能是私有的。将CreateKernel设置为私有并在RegisterRoutes之后调用如何?它不能从Ninject.Web.Mvc.dll继承,因此不能是私有的。您能告诉我如何做吗?我不知道如何创建一个Singleton,然后使用实例属性。我在这里找到了这个,所以:我会检查它。我提出了这个建议,所以我不确定你的建议是否更好见编辑。正如迭戈告诉你的,因为你使用了正确的上下文会话,所以注入会话是没有必要的。你能告诉我怎么做吗?我不知道如何创建一个Singleton,然后使用实例属性。我在这里找到了这个,所以:我会检查它。我想到了这个,所以我不确定你的建议是否更好见编辑。正如迭戈告诉你的,因为你使用了正确的上下文会话,所以注入会话是没有必要的。我不明白。那我不是必须在所有的回购中都使用GetCurrentSession吗?是的。如果这不是您想要的,为什么还要麻烦会话上下文呢?另外,另一个好处是你可以在国际奥委会给他们一种单身生活方式。我不明白。那我不是必须在所有的回购中都使用GetCurrentSession吗?是的。如果这不是您想要的,为什么还要麻烦会话上下文呢?另外,另一个好处是,你可以在国际奥委会给他们一种单身生活方式。我明白你的意思。你有关于如何做这些的教程吗?我对nhibernate和ninject还是个新手。我花了几天的时间才弄明白如何达到现在的目标,但不确定从何处开始创建SessionFactoryProvider以及其他步骤。还有,这些解决方案将如何使用muhc泛型我现在正试图避免使用它们,因为我有足够的时间来学习,我不喜欢看到现在的解决方案,整个文件似乎都在使用泛型。我想,直到有人能给我看一个教程,最好是我可以下载的源代码。我将保持原样,因为我不知道如何进行您建议的更改。我明白您的意思。你有关于如何做这些的教程吗?我对nhibernate和ninject还是个新手。我花了几天的时间才弄明白如何达到现在的目标,但不确定从何处开始创建SessionFactoryProvider以及其他步骤。还有,这些解决方案将如何使用muhc泛型我现在正试图避免使用它们,因为我有足够的时间来学习,我不喜欢看到现在的解决方案,整个文件似乎都在使用泛型。我想,直到有人能给我看一个教程,最好是我可以下载的源代码。我会保持原样,因为我不知道如何做出你推荐的改变。我最近才想到。我想这几乎涵盖了雷莫说我应该做的事情。但我不确定它是否执行步骤4。上下快速移动请不要再提及使用Ninject管理关键资源,因为这是Ninject现在的标准行为。@remo-您可能是对的。我从不确定每个人都在使用什么版本。文章提到最新版本包含此补丁。我将以更显著的通知更新这篇文章。再次感谢你在ninject上所做的工作。我最近才想到一个。我想这几乎涵盖了雷莫说我应该做的事情。但我不确定它是否执行步骤4。上下快速移动请不要再提及使用Ninject管理关键资源,因为这是Ninject现在的标准行为。@remo-您可能是对的。我从不确定每个人都在使用什么版本。文章提到最新版本包含此补丁。我将以更显著的通知更新这篇文章。再次感谢您为ninjec所做的一切工作 T