Dejando que Ninject administre mi estado de transacción, practique las preocupaciones
Estoy dejando que Ninject administre miISession
yITransaction
state en Fluid nHibnerate con el siguiente método de registro: me pregunto si es suficiente control de las transacciones o si necesito poner esto en otro luga
l pensamiento es que cadaISession
se crea en una solicitud, y ese Ninject maneja la confirmación de todo lo que se hace durante esa solicitud.
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();
}
}
He examinado el tiempo de ejecución usandoSystem.Diagnostics.Debug.WriteLine
para escribir cuando ocurren cosas, yhac parece que esto está haciendo lo que yoquerid que hacer. Lo que les pregunto a ustedes, la comunidad, es si esto es unabuen practica o no. Aquí está mi entendimiento.
Infinitas horas de lectura enhttp: //ayende.com/blog/default.asp me ha llevado a reevaluar muchas de las formas en que manejo la sesión.
Mucha investigación en la documentación de nHibernate me dice que necesito usarITransaction
cada vez que pasa algo con mi base de datos.
a ubicación de la administración en un atributo se considera una falla, ya que no cumple con la declaración mencionada anteriormente.
DoingITransaction
por operación individual no es el proceso correcto, porque requeriría que (A) mis Controladores tengan acceso a laISession
o (B) MiIRepository<T>
para tener elITransaction
lógica, que me han dicho en preguntas anteriores no era una buena práctica.
Placing myITransaction
Gestión en unaHttpModule
agrega una sobrecarga innecesaria, ya que me da a mi HttpContext conocimiento de laISession
y significa que tengo que hacer algún tipo de inyección en laHttpRequest
(que puedo hacer usando[Inject]
, pero no parece sabio)
Esto me ha llevado a esta conclusión.
as @Transactions deberían comenzar cuando unaISession
es solicitado.Todo lo que sucede en una solicitud individual está encapsulado porun ISession
Cuando unITransaction
está hecho, debe comprometerse para que el caché de segundo nivel pueda obtener sus resultados.¿Alguien puede arrojar luz sobre esto? ¿Estoy finalmente en el camino correcto? ¿O todavía me he perdido el punto por completo?