Редактировать
Я хотел бы попытаться сделать то, что рекомендовал Remo Gloor
- Создать производный SessionFactoryProvider для провайдера, который выполняет повторный запуск SessionFactory с использованием кодав OnApplicationStarted
- Создайте привязку для SessionFactory с использованием нового поставщика и поместите его в SingletonScope
- Создайте SessionProvider, производный от Provider, который получает SessionFactory, внедренный в конструктор, и повторно запускает новый сеанс с помощью GetCurrentSession ofфабрика.
- Создайте привязку для сеанса к указанному выше провайдеру с действиями активации и деактивации, которые открывают, передают, откатывают и закрывают сеанс (в основном код из Application_BeginRequest, EndRequest).Деклярируйте привязку, как в области запроса.
- Удалить Application_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);
}
}
}
В моем RepoModule у меня есть
Bind<IUserRepo>().To<UserRepo>().WithConstructorArgument("session",MvcApplication.SessionFactory.GetCurrentSession());
Это вызовет ошибку, потому что ninject создаст ядро до того, как OnApplicationStarted () запуститсяи до того, как Application_Begin начнет связывать его.
Так что мне делать?
Редактировать
Это то, что я нашел в каком-то уроке.
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, что плохо.Поэтому я не уверен, нужно ли мне сначала проверить, существует ли он.