Как передать соединение 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
    }
}

Как бы вы обернули соединение в профилированное соединение, если у вас нет доступа к процессу создания соединения? Переписать код в суперклассе и завернуть туда? Это потребует изменения сотен классов, наследуемых от базы. Я бы предпочел способ изменить базовый класс с минимальными изменениями, необходимыми для надстройки.

Спасибо, Стивен


person Stephen Patten    schedule 09.08.2011    source источник


Ответы (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.

person Stephen Patten    schedule 09.08.2011
comment
Хороший; в то время как немного приходится возиться с созданием соединения, результаты обычно достаточно информативны, чтобы избавиться от кислого привкуса ;p - person Marc Gravell; 09.08.2011
comment
В общем, я просто показал это нашим разработчикам, и лампочки начали мигать. - person Stephen Patten; 09.08.2011
comment
Становится лучше. Я показал нашему администратору баз данных запросы, которые, как я думал, выполнялись не полностью, они поступали примерно через 150 мс, и первое, что он сказал, было: «Знаете, если вы измените этот параметр с nvchar (4000) на varchar (15), это может повысить производительность, да». , теперь ВСЕ запросы приходят менее чем за 10 мс. Святое дерьмо! Согласно спецификации code.google.com/p/dapper-dot-net Строки Ansi и varchar - person Stephen Patten; 10.08.2011
comment
классно! очень доволен таким результатом - person Marc Gravell; 10.08.2011