Образец UnitOfWork и атомарные операции - PullRequest
1 голос
/ 03 августа 2009

Я не уверен на 100%, что правильно реализовал свои шаблоны Repository и UnitOfWork, но тогда я не вижу, как это будет работать.

Например, у меня есть два объекта, Apple и Orange.

Apple присоединяется к Orange через OrangeID следующим образом:

public class Apple
{
  public int OrangeID { get; set; }
}

Я хочу создать новое Apple и новый Orange, и я хочу установить соответствующую идентификационную ссылку. Но у меня есть проблема. Я не буду знать OrangeID, пока не сохраню Orange в базе данных.

Значит, у меня будет следующее:

var unitOfWork = new UnitOfWork();
Orange newOrange = new Orange();
OrangeRepository.Insert(newOrange);
unitOfWork.Commit();

//newOrange will have been updated with the actual ID
Apple newApple = new Apple(newOrange.ID);
etc...

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

Любая помощь / советы будут оценены, Спасибо Дункан

1 Ответ

1 голос
/ 03 августа 2009

Во-первых, я не вижу в этом отношения между Apple и Orange. Просто у Apple есть числовой атрибут под названием OrangeID. Ваш код должен быть таким:

Apple apple = new Apple(newOrange);
AppleRepository.Insert(apple);
unitOfWork.Commit();

Затем вы можете проверить, правильно ли установлена ​​связь с БД. Так что теперь нет никаких доказательств, работает ли ваша единица работы или нет.

Более того, существует множество доступных реализаций, если вы хотите сэкономить время.

Хотя я уже заново изобрел колесо и использую свою реализацию:)

Если вы хотите посмотреть, он размещен на Google Code: ws-helpers проект. Мне нужно время, чтобы сделать это как самостоятельный проект, потому что он был частью предыдущего проекта.

Конечно, самая известная реализация - Rhino-Tools / UnitOfWork. Но я предпочитаю свой, потому что я могу создать столько единиц, сколько мне нужно, каждая с отдельной транзакцией, в то время как в Rhino-Tools всегда есть только одна текущая единица. Но я еще не уверен насчет безопасности потоков текущей реализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...