2011-08-09 2 views
2

Учитывая этот фрагмент кодаКак передать соединение MVC-мини-профайлер для базового класса из 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 
    } 
} 

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

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

ответ

3

Ну после того, как несколько проб и ошибок я скомпрометирован, и добавил реф к 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 Databases)) и WPF/Windows Service

+0

Nice; в то время как это * немного * раздражает необходимость взломать создание соединения, результаты обычно достаточно просвечивают, чтобы отбросить кислый вкус; p –

+0

Полностью, я просто показал это своим разработчикам, и лампочки начали мигать. –

+0

Все становится лучше. Я показал нашему DBA запросы, которые, как я думал, выполнял, они приходили около 150 мс, и первое, что он сказал, было: «Вы знаете, изменили ли вы этот параметр от nvchar (4000) до varchar (15), чтобы получить лучшую производительность «да, мы сделали ВСЕ вопросы, которые пришли сейчас в возрасте до 10 м. Священный дерьмо! По спецификации http://code.google.com/p/dapper-dot-net/ Ansi Strings и varchar –