Я прошу прощения за то, что не принял это раньше. Я думал, что позаботился об этом. Большое спасибо.

воляю Ninject управлять моимISession а такжеITransaction укажите в Fluent nHibnerate следующим методом регистрации - мне интересно, достаточно ли контроля транзакций или мне нужно поместить это куда-нибудь еще.

Мысль в том, что каждыйISession создается по запросу, и этот Ninject обрабатывает фиксацию всего, что было сделано во время этого запроса.

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();
    }
}

Я исследовал время выполнения, используяSystem.Diagnostics.Debug.WriteLine писать, когда что-то происходит, и этоделает похоже, это делает то, что яв розыске это делать. Я спрашиваю вас, сообщество, является ли этохороший практиковать или нет. Вот мое понимание.

Бесчисленные часы чтения наhttp://ayende.com/blog/default.aspx заставил меня переоценить многие способы управления сессиями.

Много копаясь в документации nHibernate говорит мне, что мне нужно использоватьITransaction каждый раз, когда что-то происходит с моей базой данных.

Размещение управления в атрибуте считается недостатком, поскольку оно не соответствует вышеупомянутому утверждению.

делаITransaction для каждой отдельной операции не является правильным процессом, потому что это потребовало бы, чтобы (A) мои контроллеры имели доступ кISession или (Б) МойIRepository<T> иметьITransaction Логика, о которой мне говорили в предыдущих вопросах, не была хорошей практикой.

Размещение моегоITransaction Управление вHttpModule добавляет ненужные накладные расходы, так как это дает мои знания HttpContext оISession и это означает, что я должен сделать какую-то инъекцию вHttpRequest (что я могу сделать с помощью[Inject], но это не кажется мудрым)

Это привело меня к такому выводу.

Транзакции должны начинаться, когдаISession запрашиваетсяВсе, что происходит водин запрос инкапсулируетсяодин ISessionКогдаITransaction сделано, его нужно зафиксировать, чтобы кэш 2-го уровня мог получить свои результаты.

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

Ответы на вопрос(1)

Ваш ответ на вопрос