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 ISessionCuando 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?

Respuestas a la pregunta(1)

Su respuesta a la pregunta