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 ISessionQuando umITransaction está pronto, ele precisa ser comprometido para que o cache de segundo nível possa obter seus resultado

Alguém pode esclarecer isto? Finalmente estou no caminho certo? Ou ainda não entendi completamente o assunto?

questionAnswers(1)

yourAnswerToTheQuestion