2015-12-28 4 views
0

Допустим, мне нужно вызвать несколько служб, которые вставляют некоторые записи с EF в ту же транзакцию, что и для вставки Person и Unit.WCF TransactionScope в клиенте или услуге

Я неопределенный для, должен ли я создать новый контракт операции под названием AddPersonAndUnit и использовать TransactionScope в этом методе и назвав его от клиента или не создаю дополнительный метода и просто использовать TransactionScope в клиенте (ASP.NET MVC) и звоните AddPerson и AddUnit, которые уже существуют.

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

Как вы относитесь к хорошему выбору дизайна? Считаете ли вы, что сделка с транзакциями в клиенте «плохая»? Стоит ли создавать новый метод для этого?

+0

WCF транзакция использует MSDTC, который традиционно трудно настроить и поддержку. Мой совет не использует его без причины. –

+0

Нам нужно использовать MSDTC, поскольку некоторые из наших служб должны звонить другим службам и должны выполняться в одной транзакции. – sotn

+0

. Я проголосовал за добавление методов к сервису. Область транзакции может управляться в сервисе для двух операций, но не менее таким образом, он не должен распространяться на клиента, только на репозиторий и уровни обслуживания. – kidshaw

ответ

1

Основываясь на ваш вопрос, у Вас есть два проекта (ASP.NET MVC & WCF), и вы хотите, чтобы убедиться, что Person и Unit в настоящее время вставляется/обновляется транзакционно

Принимая те два как входы


Давайте сделаем быстрый анализ опции 1 (Используйте TransactionScope в коде клиента (класс прокси))

  1. Усилие необходимо

    • Изменить контракт на обслуживание классов (OperationContract и ServiceBehavior) для поддержки транзакций
    • облицовочных существующих метод (OperationBehavior) для Suppor транзакция
    • Изменить binding конфигурация
    • Повторно настроенный клиент binding conf iguration
  2. ПРОФИ (ТРЕБОВАНИЕ БЫТЬ):

    • требует меньше усилий => Как описано в пункте 1 ., на мой взгляд, это трудно сказать, этот метод требует меньше усилий для реализации, если все не на месте
  3. СВОД:

    • Так как код приложения (MVC) и обслуживания код (WCF) находятся в состоянии полностью контролируется вами, вы можете быть уверены, что ВСЕГДА используете транзакцию при вставке/обновлении Person и Unit. Тем не менее, я бы предпочел сделать это как услугу black-box, чтобы я мог предоставить ее другому третьему клиенту или предоставить услугу другому разработчику, чтобы использовать , не беспокоясь о несоответствии данных (что, если они забыли/намеренно пропустили транзакцию?) , Даже если вы можете заставить клиента всегда использовать транзакцию при вызове веб-служб (с помощью TransactionFlowOption.Mandatory вариант), я думаю, что хорошая практика только разоблачать минимальный сервис для клиента использовать

    • Single Ответственность также еще одна проблема

    • Повторяющиеся коды (вам нужно будет скопировать код снова и снова каждый раз, когда вы хотите, чтобы вставить Person & Unit)

Надеются, что это помогает,

Извините за плохой английский

+0

+ 1d, но не те усилия, которые вы указали, также относятся ко второму делу (используйте TransactionScope в служебном коде)? Я полностью согласен с вашими пунктами, перечисленными в «CONS». – sotn

+0

@sotn: нет, для второго случая вам не нужно использовать транзакцию в коде 'client', поэтому вам не нужно настраивать WCF –

+0

, но как насчет обслуживания сервисов? Я имею в виду, что AddPersonAndUnit будет вызывать службы AddPerson и AddUnit, что означает, что услуги могут быть клиентом для некоторых других сервисов. – sotn

Смежные вопросы