Deixe o Ninject gerenciar meu estado de transação, pratique preocupações
Estou deixando o Ninject gerenciar meuISession
eITransaction
estado no Fluent nHibnerate com o seguinte método de registro - Gostaria de saber se é suficiente o controle das transações ou se preciso colocá-lo em outro luga
O pensamento é que cadaISession
é criado em uma solicitação e o Ninject lida com a confirmação de tudo o que foi feito durante essa solicitaçã
public class SessionModule : Ninject.Modules.NinjectModule
{
private static ISessionFactory sessionFactory;
public override void Load()
{
Bind<ISessionFactory>()
.ToMethod(c => CreateSessionFactory())
.InSingletonScope();
Bind<ISession>()
.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();
}
}
});
}
/// <summary>
/// Create a new <see cref="NHibernate.ISessionFactory"/> to connect to a database.
/// </summary>
/// <returns>
/// A constructed and mapped <see cref="NHibernate.ISessionFactory"/>.
/// </returns>
private static ISessionFactory CreateSessionFactory()
{
if (sessionFactory == null)
sessionFactory = Persistence.SessionFactory.Map
(System.Web.Configuration
.WebConfigurationManager
.ConnectionStrings["Local"]
.ConnectionString
);
return sessionFactory;
}
/// <summary>
/// Open a new <see cref="NHibernate.ISession"/> from a <see cref="NHibernate.ISessionFactory"/>.
/// </summary>
/// <returns>
/// A new <see cref="NHibernate.ISession"/>.
/// </returns>
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();
}
}
Examinei o tempo de execução usandoSystem.Diagnostics.Debug.WriteLine
para escrever quando as coisas ocorrem,fa parece que isso está fazendo o que euprocurad fazer. O que estou perguntando a você, a comunidade, é se esse é umBo pratique ou não. Aqui está o meu entendimento.
Incontáveis horas de leitura emhttp: //ayende.com/blog/default.asp @ me levou a reavaliar muito da maneira como faço o gerenciamento de sessõe
Muitas pesquisas na documentação do nHibernate me dizem que preciso usar oITransaction
toda vez que algo acontece com meu banco de dados.
A colocação do gerenciamento em um atributo é considerada uma falha, uma vez que não segue a declaração acima mencionad
DoingITransaction
por operação individual não é o processo correto, porque exigiria que (A) meus Controladores tivessem acesso aoISession
ou (B) meuIRepository<T>
para ter oITransaction
lógica, que me foi dito nas perguntas anteriores, não era uma boa prátic
Colocando meuITransaction
Gerenciamento em umHttpModule
adiciona uma sobrecarga desnecessária, pois fornece meu conhecimento HttpContext doISession
e isso significa que eu tenho que fazer algum tipo de injeção noHttpRequest
(o que posso fazer usando[Inject]
, mas não parece sensato)
Isso me levou a esta conclusão.
As transações devem começar quando umISession
é requerido Tudo o que acontece em umsingle request é encapsulado por ISession
Quando umITransaction
está pronto, ele precisa ser comprometido para que o cache de segundo nível possa obter seus resultadoAlguém pode esclarecer isto? Finalmente estou no caminho certo? Ou ainda não entendi completamente o assunto?