как реализовать шаблон unitofwork при использовании дозвукового 2.1 (шаблон репозитория)?

Я использую шаблон дозвукового репозитория (2.1) для приложения asp.net mvc. В моем приложении есть много репозиториев, таких как categoryRepository, Blogrepository и т. Д. Внутри каждого из этих репозиториев я вызываю subsonic DB.Select().From()...ExecuteReader(), а затем загружаю объекты домена из этого считывателя.

В действии контроллера я делаю несколько вызовов из этих репозиториев, например,

List<IBlog> blogs=_blogRepository.GetHottestBlogs();

List<ICategory> categories=_categoryRepository.GetAll();

Должен ли я реализовать для этого какой-либо шаблон unitofwork? .Я сомневаюсь в том, как subsonic выполняет каждую операцию DB.Update / Insert / Select. Достаточно ли TransactionScope для пакетного обновления или мне нужно использовать SharedDbConnectionScope для повышения производительности?


person Rohith    schedule 22.05.2010    source источник


Ответы (1)


С SubSonic вам нужно объединить TransactionScope и SharedDbConnectionScope. В противном случае каждая команда будет использовать свое собственное выделенное соединение, которое удаляется после выполнения, что приведет к неявной фиксации (по крайней мере, для MySQL и Sql Server, я думаю).

Каждый запрос SubSonic в SharedDbConnectionScope будет использовать одно и то же соединение, поэтому вы можете использовать TransactioScope.

И вы должны использовать SharedDbConnectionScope перед TransactionScope, иначе некоторые поставщики не обнаружат, что вы выполняете транзакцию.

using (new SharedDbConnectionScope())
{
    using (TransactionScope ts = new TransactionScope()
    {

        // Do some sh*i ;)
        ts.Complete();
    }
}
person Jürgen Steinblock    schedule 26.05.2010
comment
Большое спасибо за ваш ответ. Я пытался использовать TransactionScope до SharedDbConnectionScope. Вот как это делается в модульных тестах, поставляемых с дозвуковой библиотекой. - person Rohith; 26.05.2010
comment
Ага, какое-то время назад даже в документации было неправильно. Однако это зависит от того, как библиотека БД реализует TransactionScope. Сервер Afaik Sql ищет Transaction.Current только при создании SqlConnection, в то время как MySql поддерживает TransactionScope, который будет использоваться после создания MySqlConnection. Однако, поскольку SubSonic поддерживает несколько СУБД, всегда лучше сначала использовать SharedDBConnectionScope. - person Jürgen Steinblock; 27.05.2010