Рефакторинг ADO.NET - SqlTransaction по сравнению с TransactionScope

редактирование (не автором): существует всесторонний список платформ МОК, доступных в https://github.com/quozd/awesome-dotnet/blob/master/README.md#ioc:

  • замок Windsor - замком Windsor является лучшая среди аналогов, сформировавшаяся Инверсия контейнера Управления, доступного для.NET и единицы Silverlight
  • - Легкий расширяемый контейнер внедрения зависимости с поддержкой конструктора, свойства и инжекции вызова метода
  • Autofac - захватывающая.NET контейнер МОК
  • DryIoc - Простой, быстро весь полнофункциональный контейнер МОК.
  • Ninject - ниндзя инжекторов зависимости.NET
  • StructureMap - исходный Контейнер МОК/DI для .NET
  • Spring. Сеть - Spring.NET является платформой приложения с открытым исходным кодом, которая подает заявки предприятия здания.NET, легче
  • LightInject - крайний легкий контейнер МОК
  • Простой Инжектор - Простой Инжектор является простой в использовании библиотекой Dependency Injection (DI) для.NET 4 +, который поддерживает Silverlight 4 +, Windows Phone 8, Windows 8 включая Универсальные приложения и Моно.
  • Microsoft. Расширения. DependencyInjection - контейнер МОК по умолчанию для Базовых приложений ASP.NET.
  • Scrutor - расширения сканирования блока для Microsoft. Расширения. DependencyInjection.
  • VS MEF - реализация Управляемой платформы расширяемости (MEF) используется Visual Studio.
  • TinyIoC - простое в использовании, свободная стычка, Инверсия Контейнера Управления для маленьких проектов, библиотек и новичков одинаково.

Исходный ответ следует.

я предполагаю, что мог бы быть немного придирчивым здесь, но важно отметить, что DI (Внедрение зависимости) является шаблоном программирования и упрощен, но не требует, МОК (Инверсия Управления) платформа. Платформы МОК просто делают DI намного легче, и они обеспечивают хост других преимуществ свыше DI.

Однако я уверен, что это - то, что Вы спрашивали. О Платформах МОК; я раньше использовал Spring. Сеть и CastleWindsor много, но реальная боль в позади был всем, что противные XML конфигурируют Вас, должен был записать! Они в значительной степени все перемещают этот путь теперь, таким образом, я использовал StructureMap в течение прошлого года или так, и так как он переместился в быструю конфигурацию с помощью дженериков со строгим контролем типов и реестра, мой барьер боли в использовании МОК спал ниже нуля! Я вытаскиваю абсолютный удар из знания теперь, когда моя конфигурация МОК проверяется во время компиляции (по большей части), и у меня была только радость с StructureMap и его скоростью. Я не скажу, что другие были медленными во времени выполнения, но они были более трудными для меня установить, и разочарование часто выигрывало день.

Обновление

я использовал Ninject на моем последнем проекте, и это было абсолютное удовольствие использовать. Слова приводят меня к сбою немного здесь, но (как мы говорим в Великобритании) эта платформа является 'Собаками'. Я настоятельно рекомендовал бы его для любых проектов зеленых полей, где Вы хотите быть в порядке быстро. Я получил все, в чем я нуждался от фантастический набор скринкастов Ninject Justin Etheredge. Я не вижу, что модифицирование Ninject в существующий код, являющийся проблемой вообще, но затем то же могло быть сказано относительно [1 119] StructureMap, по моему опыту. Это будет сложный выбор, продвигающийся между теми двумя, но у меня были бы конкуренция, чем застой и существует достойный объем здоровой конкуренции там.

Другие скринкасты МОК могут также быть найдены здесь на Dimecasts.

28
задан marc_s 13 August 2009 в 09:29
поделиться

4 ответа

Вы ничего не получите немедленно, переключив существующий код на использование TransactionScope . Вы должны использовать его для будущих разработок, поскольку он обеспечивает гибкость. В будущем будет проще включать в транзакцию вещи, отличные от вызовов ADO.NET.

Кстати, в вашем опубликованном примере экземпляры SqlCommand должны находиться в с использованием блоки.

16
ответ дан 28 November 2019 в 03:26
поделиться

Microsoft рекомендует использовать область транзакции:

http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx

Основная идея заключается в том, что область транзакции будет управлять "внешним контекстом транзакции" за вас. Вы начинаете с разговора с одной базой данных, у вас есть транзакция sql, затем вы разговариваете с базой данных номер 2, и транзакция повышается до распределенной транзакции.

Объем транзакции действительно работает для вас, так что вы можете сосредоточиться на функциональности системы, а не водопровода.

РЕДАКТИРОВАТЬ

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

РЕДАКТИРОВАТЬ 2

Согласен с комментарием к Трийнко ниже. Однако мы используем Entity Framework, EF автоматически закроет и снова откроет соединение, чтобы подключить его к транзакции. Он не закрывает соединение физически, скорее, он выпускает его в пул соединений и получает новый, который может быть таким же или другим.

которые могут быть одинаковыми или разными.

которые могут быть одинаковыми или разными.

8
ответ дан 28 November 2019 в 03:26
поделиться

Просто обратите внимание, что при использовании Transaction Scope иногда возникают большие проблемы, потому что многие настройки, которые мы должны выполнить на сервере, такие как настройка DTC, брандмауэра и т. Д., Я рекомендовал использовать SqlTransaction для большей экономии в реализации.

6
ответ дан 28 November 2019 в 03:26
поделиться

Я предпочитаю TransactionScope. Это не отлично работают в любом сценарии, но в том, который вы описываете, это лучшее решение.

Мое рассуждение:

  1. Включение в транзакцию происходит автоматически.
  2. Откат транзакции в случае возникновения исключения выполняется автоматически.

В совокупности результатом является немного меньше кода и, как правило, более надежная конструкция, поскольку система обрабатывает некоторые детали для меня; мне нужно помнить на одну вещь меньше.

Кроме того, прозрачная регистрация транзакций может быть особенно полезна, когда у вас есть несколько вложенных методов в вашем DAL - хотя вы должны позаботиться о том, чтобы случайно не получить вашу транзакцию превратиться в распределенную, требующую DTC, что может произойти, если вы используете несколько SqlConnections, даже если они указывают на одну и ту же БД.

9
ответ дан 28 November 2019 в 03:26
поделиться
Другие вопросы по тегам:

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