Почему я использовал бы шаблон Единицы работы сверх сессии NHibernate?

Изменение цветов тоста без каких-либо дополнительных макетов, 2018

Это очень простой способ изменения цвета фона фактического изображения тоста, а также цвет текста, он не требует каких-либо дополнительных макетов или каких-либо изменений XML:

Toast toast = Toast.makeText(context, message, duration);
View view = toast.getView();

//Gets the actual oval background of the Toast then sets the colour filter
view.getBackground().setColorFilter(YOUR_BACKGROUND_COLOUR, PorterDuff.Mode.SRC_IN);

//Gets the TextView from the Toast so it can be editted
TextView text = view.findViewById(android.R.id.message);
text.setTextColor(YOUR_TEXT_COLOUR);

toast.show();
5
задан ng5000 11 June 2009 в 11:27
поделиться

3 ответа

Описываемая вами единица работы уже предоставлена ​​NHibernate, поэтому нет причин для этого такая единица работы.

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

  1. Код, который должен иметь дело с единицей работы. Неважно, кто поддерживает единицу работы. Это может быть NHibernate, iBatis или пользовательский ORM. Все, что нужно сделать коду, это загрузить, откатить, сохранить и т. Д. Он не должен и не должен заботиться о механизме, используемом для этого.

  2. Код, который должен иметь дело с ISession напрямую, потому что он ' делает определенные вещи NHibernate. Обычно это связано со сложными запросами, которые необходимо создать.

  3. Не нужно знать, что он выполняется в Unit Of Work или имеет доступ к ISession. Мы можем полностью проигнорировать это в рамках данного обсуждения.

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

  • Когда мы начинали, мы не были на 100% проданы NHibernate. Мы рассматривали iBatis или что-то нестандартное. Очевидно, это больше не проблема.

  • Вся команда не является экспертом по NHibernate, и мы этого не хотим. По большей части люди пишут код, который попадает в категорию 1. Все, о чем они знают, - это наша Единица Работы. Когда код в категории 2. должно быть написано, это должно быть написано людьми в команде, которые хорошо понимают NHibernate.

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

5
ответ дан 14 December 2019 в 13:45
поделиться

Моя основная единица работы интерфейса содержит следующие методы - Инициализировать - Зафиксировать - Откат - IDisposable.Dispose

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

1
ответ дан 14 December 2019 в 13:45
поделиться

Если вы правильно настроили все свои сопоставления (т.е. каскады), вам не нужно делать ничего особенного, и ISession подойдет. Однако, если вы пишете трехуровневое приложение, вам придется вручную упорядочить операции с базой данных, которые вы хотите выполнить в одной транзакции. «Эталонная реализация» Фаулера в «Шаблонах архитектуры корпоративных приложений» может быть хорошей отправной точкой:

class UnitOfWork... 

   public void registerNew(DomainObject obj) {
      Assert.notNull("id not null", obj.getId());
      Assert.isTrue("object not dirty", !dirtyObjects.contains(obj));
      Assert.isTrue("object not removed", !removedObjects.contains(obj));
      Assert.isTrue("object not already registered new", !newObjects.contains(obj));
      newObjects.add(obj);
   }
   public void registerDirty(DomainObject obj) {
      Assert.notNull("id not null", obj.getId());
      Assert.isTrue("object not removed", !removedObjects.contains(obj));
      if (!dirtyObjects.contains(obj) && !newObjects.contains(obj)) {
         dirtyObjects.add(obj);
      }
   }
   public void registerRemoved(DomainObject obj) {
      Assert.notNull("id not null", obj.getId());
      if (newObjects.remove(obj)) return;
      dirtyObjects.remove(obj);
      if (!removedObjects.contains(obj)) {
         removedObjects.add(obj);
      }
   }
   public void registerClean(DomainObject obj) {
      Assert.notNull("id not null", obj.getId());
   }
0
ответ дан 14 December 2019 в 13:45
поделиться
Другие вопросы по тегам:

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