Разрешение Ninject управлять состоянием моей транзакции, практические проблемы

Я разрешаю 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-го уровня мог получить свои результаты.

Может ли кто-нибудь пролить свет на это? Я наконец на правильном пути? Или я все еще полностью упустил суть?

11
задан Ciel 19 March 2011 в 17:18
поделиться