Каковы эталонные реализации .net шаблона Unit of Work? - PullRequest
2 голосов
/ 03 июня 2009

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

При использовании с ORM (например, с NHibernate) хорошей практикой считается реализация единицы работы с общей ISession (или DataContext в Linq 2 Sql), используемой для каждого действия с базовым БД.

Это может быть сложно реализовать правильно, особенно при работе с серверными приложениями, в основном ASP.Net MVC или ASP.Net Webforms.

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

Каковы наиболее часто используемые и как их легко интегрировать в ASP.Net MVC (или WebForms, но я в основном заинтересован в MVC)?

1 Ответ

3 голосов
/ 03 июня 2009

Обновление : я видел это ( шаблон работы в сети ) после ответа.

Возможно, System.Transactions.Transaction - это то, что вам нужно.

Единица работы - это термин, который был первоначально применен к приложениям на мэйнфреймах много лет назад. Приложения будут выполнять ряд шагов. Если какой-либо из шагов завершился неудачей, база данных будет откатана до предыдущей «точки синхронизации». Приложение будет записывать новую синхронизирующую точку после успешного завершения всех шагов в единице работы. Шаги вели себя как единое целое.

Метафора эволюционировала таким образом, что в .NET мы имеем конструкцию Transaction. Работа, выполняемая с восстанавливаемыми хранилищами данных в рамках транзакции, выполняется как единое целое со свойствами ACID. Примерами таких хранилищ данных могут быть: любая современная СУБД, система массового обслуживания, такая как MSMQ, или, в Windows, файловая система или реестр (через KTM). Когда транзакция разрешается, она либо фиксирует, либо откатывает все операции во всех транзакционных хранилищах.

Я не знаю о nHibernate или конструкции ISession. Но если вы используете термин «единица работы» в традиционном смысле, то я думаю, что вам нужна транзакция.

Что касается интеграции транзакций в ASP.NET MVC - не уверен, что это будет означать. Транзакции не волнует, что такое модель пользовательского интерфейса или как вы разработали управление потоком пользовательского интерфейса. Если вы обновляете базу данных (я полагаю, «модель»), то у вас есть возможность включить это обновление в транзакцию. Действительно имеет смысл, только если у вас есть несколько обновлений, как часть одной транзакции. С другой стороны, вы не хотите, чтобы транзакции оставались открытыми в течение длительных периодов времени. блокировка базы данных приведет к конфликту и, как следствие, к снижению пропускной способности.

...