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

воляю 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&nbsp;писать, когда что-то происходит, и этоделает&nbsp;похоже, это делает то, что яв розыске&nbsp;это делать. Я спрашиваю вас, сообщество, является ли этохороший&nbsp;практиковать или нет. Вот мое понимание.

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

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

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

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

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

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

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

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