NHibernate, транзакции и TransactionScope

Если Вы работаете главным образом с текстом (как большинство программистов, или другие технические люди делают), или даже документы, то portait режим намного более ценен. На самом деле общая тенденция в дисплеях является всем неправильным направлением: соотношения сторон хлюпают отображения с перспективой к почтовому слоту для лучше установки формату фильмов. Лично, я имею никогда , смотрел кино на моих компьютерах (ноутбук или рабочий стол), и я не собираюсь запуститься теперь - это - то, для чего у меня есть ТВ!

В действительности, вертикальные пиксели являются наиболее ценным активом в вычислениях - делают то, что Вы можете для получения больше из них - Вы не будете сожалеть, что потратили деньги! Я даже не куплю ноутбук меньше чем с 1024-1080 вертикальными пикселями, так как это minumum, требуемый отобразить полную страницу PDF в читаемом разрешении, и (намного) больше лучше. (Так как PDFs составляют значительную часть сегодняшней онлайн-документации / руководства, это - очень большое беспокойство.) Необходимо только думать о ширине после , у Вас есть достаточно вертикальных пикселей.

то, Что я действительно хочу, является 15,4-дюймовым или 16-дюймовым ноутбуком с портрет экран - они должны все еще быть достаточно широкими для упаковки полноразмерной клавиатуры в основу - рука центра FlyBook-стиля была бы хороша, но не требуется.

5
задан codekaizen 2 October 2012 в 17:19
поделиться

2 ответа

Я использовал очень похожий подход. В HttpModule я запрашиваю у sessionfactory новый сеанс + привязываю его при поступлении нового запроса. Но я также начинаю транзакцию здесь. Затем, когда запрос заканчивается, я просто отвязываю его и пытаюсь зафиксировать транзакцию.

Также мой базовый репозиторий никоим образом не принимает сеанс - вместо этого он запрашивает текущий сеанс, а затем выполняет некоторую работу с ним. Также я ничего не оборачиваю внутри этого базового класса с транзакцией. Вместо этого весь http-запрос - это единая единица работы.

Это может не подходить для проекта, над которым вы работаете, но я предпочитаю этот подход, потому что каждый запрос будет неудачным или успешным как единая атомарная единица. У меня есть полная запись в блоге здесь с исходным кодом, если вас интересует реальная реализация.

Ниже приведен пример того, как выглядит этот базовый репозиторий:

public abstract class NHibernateRepository<T> where T : class
{

    protected readonly ISessionBuilder mSessionBuilder;

    public NHibernateRepository()
    {
        mSessionBuilder = SessionBuilderFactory.CurrentBuilder;
    }

    public T Retrieve(int id)
    {
            ISession session = GetSession();

            return session.Get<T>(id);
    }

    public void Save(T entity)
    {
            ISession session = GetSession();

            session.SaveOrUpdate(entity);
    }

    public void Delete(T entity)
    {
            ISession session = GetSession();

            session.Delete(entity);
    }

    public IQueryable<T> RetrieveAll() 
    { 
            ISession session = GetSession();

            var query = from Item in session.Linq<T>() select Item; 

            return query; 
    }

    protected virtual ISession GetSession()
    {
        return mSessionBuilder.CurrentSession;
    }
}
2
ответ дан 14 December 2019 в 19:18
поделиться

Спасибо за ответ!

Да, это простой и понятный способ решить эту проблему. Но моя проблема в том, что я хочу убедиться, что существует транзакция, связанная с операцией репозитория, даже если служба приложения, репозиторий и т.д. не вызывается веб-запросом (другие типы клиентов), поэтому я хотел иметь транзакцию, окружающую операцию самый низкий уровень (например, session.Save), а затем используйте TransactionScope для создания более длинной транзакции, если это необходимо. Но ваше решение простое, и оно мне нравится, мэйбай, я воспользуюсь им, а затем проверю, что другие клиенты также используют транзакции.

1
ответ дан 14 December 2019 в 19:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: