Я разрешаю Ninject управлять моим состоянием ISession
и ITransaction
в Fluent nHibnerate с помощью следующего метода регистрации - мне интересно, если это достаточный контроль транзакций, или мне нужно поместить это в другое место.
Идея состоит в том, что каждая ISession
создается по запросу, и что Ninject обрабатывает фиксацию всего, что было сделано во время этого запроса.
public class SessionModule : Ninject.Modules.NinjectModule
{
private static ISessionFactory sessionFactory;
public override void Load()
{
Bind()
.ToMethod(c => CreateSessionFactory())
.InSingletonScope();
Bind()
.ToMethod(c => OpenSession())
.InRequestScope()
.OnActivation(session =>
{
session.BeginTransaction();
session.FlushMode = FlushMode.Commit;
})
.OnDeactivation(session =>
{
if (session.Transaction.IsActive)
{
try
{
session.Flush();
session.Transaction.Commit();
}
catch
{
session.Transaction.Rollback();
}
}
});
}
///
/// Create a new to connect to a database.
///
///
/// A constructed and mapped .
///
private static ISessionFactory CreateSessionFactory()
{
if (sessionFactory == null)
sessionFactory = Persistence.SessionFactory.Map
(System.Web.Configuration
.WebConfigurationManager
.ConnectionStrings["Local"]
.ConnectionString
);
return sessionFactory;
}
///
/// Open a new from a .
///
///
/// A new .
///
private static ISession OpenSession()
{
// check to see if we even have a session factory to get a session from
if (sessionFactory == null)
CreateSessionFactory();
// open a new session from the factory if there is no current one
return sessionFactory.OpenSession();
}
}
I ' Мы исследовали среду выполнения, используя System.Diagnostics.Debug.WriteLine
, чтобы писать, когда что-то происходит, и действительно выглядит так, как будто он выполняет то, что я хотел , чтобы он делал . Я спрашиваю вас, сообщество, является ли это хорошей практикой или нет. Вот мое понимание.
Бесчисленные часы чтения http://ayende.com/blog/default.aspx заставили меня переоценить многие методы управления сеансами. поскольку он дает мне знания HttpContext о ISession
, и это означает, что мне нужно сделать какую-то инъекцию в HttpRequest
(что я могу сделать с помощью [Inject]
, но это не кажется разумным)
Это привело меня к такому выводу.
ISession
. ISession
ITранзакция
завершена, ее необходимо зафиксировать, чтобы кэш 2-го уровня мог получить свои результаты. Может ли кто-нибудь пролить свет на это? Я наконец на правильном пути? Или я все еще полностью упустил суть?