Управление сеансами NHibernate и ленивая загрузка

Вот пара различных способов реализации перечислений TypeScript .

Самый простой способ - просто перебрать объект, добавив к нему инвертированные пары ключ-значение. Единственным недостатком является то, что вы должны вручную установить значение для каждого члена.

function _enum(list) {       
  for (var key in list) {
    list[list[key] = list[key]] = key;
  }
  return Object.freeze(list);
}

var Color = _enum({
  Red: 0,
  Green: 5,
  Blue: 2
});

// Color → {0: "Red", 2: "Blue", 5: "Green", "Red": 0, "Green": 5, "Blue": 2}
// Color.Red → 0
// Color.Green → 5
// Color.Blue → 2
// Color[5] → Green
// Color.Blue > Color.Green → false


А вот lodash mixin для создания перечисления с использованием строки. Хотя эта версия немного сложнее, она выполняет нумерацию автоматически. Все методы lodash, используемые в этом примере, имеют обычный JavaScript-эквивалент, поэтому вы можете легко их отключить, если хотите.

function enum() {
    var key, val = -1, list = {};
    _.reduce(_.toArray(arguments), function(result, kvp) {    
        kvp = kvp.split("=");
        key = _.trim(kvp[0]);
        val = _.parseInt(kvp[1]) || ++val;            
        result[result[val] = key] = val;
        return result;
    }, list);
    return Object.freeze(list);
}    

// Add enum to lodash 
_.mixin({ "enum": enum });

var Color = _.enum(
    "Red",
    "Green",
    "Blue = 5",
    "Yellow",
    "Purple = 20",
    "Gray"
);

// Color.Red → 0
// Color.Green → 1
// Color.Blue → 5
// Color.Yellow → 6
// Color.Purple → 20
// Color.Gray → 21
// Color[5] → Blue

17
задан joshlrogers 23 June 2009 в 19:36
поделиться

2 ответа

Я работаю над аналогичным приложением. Я использую один сеанс, который я держу открытым.

Когда я пишу в базу данных, я использую транзакцию начала / фиксации, которая не закрывает базовый сеанс. соединение с базой данных открывается только NHibernate во время выполнения транзакции.

Есть ли причина, по которой вам нужно закрыть сеанс, когда пользователь активно использует форму?

Не могли бы вы предоставить более подробную информацию о том, что вы используете для управления сеансом, шаблоном репозитория и т. д.?

2
ответ дан 30 November 2019 в 14:39
поделиться

Я могу придумать несколько вариантов:

Вариант 1: оставить исходный сеанс ISession открытым, пока пользователь взаимодействует с данными, и зафиксировать все изменения сразу, когда пользователь закончит работу. Это означает, что у вас может быть большое количество незафиксированных изменений в памяти, и другие пользователи не увидят ожидающих изменений.

Вариант 2: Разделите операции на две единицы работы (UOW). UOW1 только читает и отвечает за заполнение списка. ISession, связанный с UOW1, остается активным, чтобы разрешить отложенную загрузку, например, в сценарии детализации. UOW2 - это новый недолговечный ISession, созданный для редактирования пользователем. Когда правка фиксируется, исходный объект удаляется из UOW1, а UOW1 извлекает новую копию из базы данных.

Вариант 3: воссоздавать список после каждой фиксации редактирования.

7
ответ дан 30 November 2019 в 14:39
поделиться
Другие вопросы по тегам:

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