Как передать соединение mvc-mini-profiler в базовый класс из MVC3
Учитывая этот фрагмент кода
public abstract class Foo
{
private static SqlConnection _sqlConnection;
protected SqlConnection GetOpenConnection()
{
if (_sqlConnection == null)
{
_sqlConnection = new SqlConnection("connection string");
}
return _sqlConnection;
}
protected abstract void Execute();
}
public class FooImpl : Foo
{
protected override void Execute()
{
var myConn = GetOpenConnection();
var dog = myConn.Query<dynamic>("select 'dog' Animal");
var first = dog.First();
string animalType = first.Animal;
// more stuff here
}
}
Как бы вы обернули соединение в профилированное соединение, если у вас нет доступа к процессу создания соединения? Переписать код в суперклассе и перенести его туда? Это будет связано с изменением сотен классов, которые наследуются от базы. Я бы предпочел способ изменить базовый класс, с минимальными изменениями, необходимыми для суперсоваров.
Спасибо Стивен
1 ответ
Решение
Через некоторое время после проб и ошибок я скомпрометировал и добавил ссылку на MvcMiniProfiler в базовой библиотеке и немного изменил код подключения.
protected DbConnection GetOpenConnection()
{
if (_connection == null)
{
_connection = new SqlConnection(ConfigurationManager.ConnectionStrings["connection string "].ConnectionString);
_connection.Open();
}
return MvcMiniProfiler.Data.ProfiledDbConnection.Get(_connection, MiniProfiler.Current);
}
private static SqlConnection _connection;
Это работает как для хостинга в проекте MVC (для целей профилирования, где у нас нет такой возможности (базы данных QA/Prod)), так и для службы WPF/Windows.