Как можно интегрировать MVCMiniProfiler с PetaPoco без изменения источников - PullRequest
4 голосов
/ 19 августа 2011

Я пытаюсь заставить MVCMiniProfiler работать с PetaPoco

Я пытаюсь установить соединение при создании БД PetaPoco, но сталкиваюсь с проблемами (connectionClosed)

public class DbHelper
{
    static Database _CurrentDb = null;
    public static Database CurrentDb()
    {
        if (_CurrentDb == null)
        {
            string connstr = ConfigurationManager.ConnectionStrings["MainConnectionString"].ConnectionString;
            var conn = ProfiledDbConnection.Get(new SqlConnection(connstr));
            _CurrentDb = new PetaPoco.Database(conn);
        }
        return _CurrentDb;
    }

}

Я прочитал этот элемент https://github.com/toptensoftware/PetaPoco/issues/44, но могу заставить его работать

Как правильно это сделать?

Редактировать

Решение предоставил Гарет Элмс:

public class DbHelper
{
    static Database _CurrentDb = null;
    public static Database CurrentDb()
    {
        if (_CurrentDb == null)
        {
            _CurrentDb = new DatabaseWithMVCMiniProfiler("MainConnectionString");
        }
        return _CurrentDb;
    }

}
public class DatabaseWithMVCMiniProfiler : PetaPoco.Database
{
    public DatabaseWithMVCMiniProfiler(IDbConnection connection) : base(connection) { }
    public DatabaseWithMVCMiniProfiler(string connectionStringName) : base(connectionStringName) { }
    public DatabaseWithMVCMiniProfiler(string connectionString, string providerName) : base(connectionString, providerName) { }
    public DatabaseWithMVCMiniProfiler(string connectionString, DbProviderFactory dbProviderFactory) : base(connectionString, dbProviderFactory) { }

    public override IDbConnection OnConnectionOpened( IDbConnection connection)
    {
        // wrap the connection with a profiling connection that tracks timings 
        return MvcMiniProfiler.Data.ProfiledDbConnection.Get( connection as DbConnection, MiniProfiler.Current);
    }
}

Ответы [ 2 ]

3 голосов
/ 20 августа 2011

Интересно, это потому что это статический класс? Может показаться странным, что соединение автоматически закрывается после запроса, а счетчик _sharedConnectionDepth компании petapoco не знает об этом. Я легко воспроизвел это, используя ваш код. Взгляните на мой пример приложения petapoco на github https://github.com/GarethElms/PetaPoco----A-simple-web-app, все что я делаю - это создаю экземпляр Database в базовом контроллере

1 голос
/ 15 февраля 2012

как упомянул Schotime, для каждого запроса лучше всего подходит mvc. Это мой импл, использующий Ninject

private static void RegisterServices(IKernel kernel)
{


#if DEBUG
            kernel.Bind<IDatabase>().To<DebugDatabase>()
               .InRequestScope()
               .WithConstructorArgument("connectionStringName", "DebugCnnString");
#else
            kernel.Bind<IDatabase>().To<ReleaseDatabase>()
               .InRequestScope()
               .WithConstructorArgument("connectionStringName", "ReleaseCnnString");
#endif
}

public class DebugDatabase : PetaPoco.Database
{
    public DebugDatabase(string connectionStringName) : base(connectionStringName) { }

    public override IDbConnection OnConnectionOpened(IDbConnection connection)
    {
        // wrap the connection with a profiling connection
        return new ProfiledDbConnection(connection as DbConnection, MiniProfiler.Current);
    }
}

public class ReleaseDatabase : PetaPoco.Database
{
    public ReleaseDatabase(string connectionStringName) : base(connectionStringName)    {   }

    // ... some stuff
}
...