我怎样才能解决这个问题?我想注入一个nhibernate会话,但该会话尚未创建
编辑 我想尝试做Remo Gloor建议的事情 为使用OnApplicationStarted中的代码重新运行SessionFactory的提供程序创建派生的SessionFactoryProvider 使用新的提供程序为SessionFactory创建绑定,并将其放入SingletonScope中 创建从提供程序派生的SessionProvider,该提供程序在构造函数中注入SessionFactory,并使用工厂的GetCurrentSession重新启动新会话。 为ISession创建一个绑定,该绑定使用激活和停用操作打开、传输、回滚和关闭会话,基本上是应用程序_BeginRequest、EndRequest中的代码。将绑定标记为请求范围中的绑定。 删除应用程序_BeginRequest,EndRequest。 使用Bind.To绑定回购协议; 我正在寻找一个教程,点击这些点与一个文件,我可以下载和发挥周围。如果它使用了大量的泛型,你需要非常详细,因为泛型仍然会吸引我 嗨 我正在尝试使用我的nhibernate按请求进行会话 我在我的global.aspx中这样做了我怎样才能解决这个问题?我想注入一个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创建一个
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