Я рассматривал аналогичную проблему с Linq для Sql - изначально наше решение заключается в том, чтобы использовать одно и то же соединение для каждого запроса. Рик Страл написал серию постов в блоге, которые стоило посмотреть.
В нашем решении конструктор (и) DataContext имеет перегруженный конструктор, который извлекает соединение с фабрики (если соединение не существует, переданное соединение сохраняется в потоке)
public DataContext1(connection)
: base (ConnectionFactory.GetConnectionFromContext(connection))
{
}
Кажется, что это нормально работает в сценарии WCF, фабрика соединений может сохранять / извлекать из коллекции ServiceModel.OperationContext.Items и (что более важно) подписываться на событие OperationComplete для закрытия / удаления соединения в потоке когда все операции выполнены.
Я обнаружил, что нам также необходимо расширить объект соединения, чтобы вы могли предотвратить автоматическое закрытие / дипозал внутреннего соединения, когда располагаются текстовые данные-владельцы (например, после завершения каждой области действия).
Сейчас я смотрю на сценарии, не относящиеся к WCF ... ТБХ, это не красиво. У нас также нет триггера события OperationCompleted, который есть в контексте WCF.