Как реорганизовать повторение IDbConnection.open\close?

может глупый вопрос, но я сам себя запутал. Я использую Dapper с Autofac (DI) и на своем бизнес-уровне всегда использую следующую конструкцию:

db.Open(); //db is IDbConnection instance
db.InsertOrDeleteOrUpdate(...)
db.Close();

хорошее ли решение скрыть db.Open() и db.Close() методом делегата? Например:

dbHelper.do(db => db.InsertOrDeleteOrUpdate(...));

Что вы делаете в таких случаях?


person Vilix    schedule 18.02.2017    source источник


Ответы (1)


Избыточный код — не единственная проблема в этом коде. Ваш код попадает в базу данных для каждого действия. Это повлияет на производительность, если ваш DBServer развернут на удаленной машине. См. этот ответ.

Вы когда-нибудь сталкивались с шаблоном UnitOfWork? Это очень хорошее решение для обработки соединений на более высоком уровне.

Connection Factory — еще одна хорошая альтернатива, которую можно использовать с UnitOfWork. Но я лично предпочитаю только UnitOfWork.

Обратитесь к этому ответу для примера кода UnitOfWork.

Как только вы выберете из вышеперечисленного, легко уменьшить избыточность, используя шаблон «подключение по запросу». Вам нужно определить централизованное место в вашем коде, где создать DalSession и где его разместить.

person Amit Joshi    schedule 19.02.2017
comment
Спасибо, но соединение для запроса в моем случае не проблема, пул соединений должен работать, см. ответ stackoverflow.com/questions/4439409/. Фабрика соединений и UnitOfWork могут только открывать соединение, в моей реализации DI я могу db.Open в конструкторе, но это не решение. И я не хочу использовать шаблон репозитория, когда у меня есть ORM. Мне нужно просто реорганизовать этот код, мы можем абстрагироваться от БД. - person Vilix; 20.02.2017
comment
У вас есть ORM, поэтому вам следует подумать о реализации UnitOfWork. Dapper не предоставляет для этого готовую реализацию. Вот почему я предложил ссылку, которая показывает пример кода. - person Amit Joshi; 20.02.2017
comment
UnitOfWork — это не просто транзакция или соединение; это больше. Действительно хорошая вещь, чтобы учиться и применять. stackoverflow.com/q/39909985/5779732 - person Amit Joshi; 20.02.2017