2

このコード スニペットを考えると

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
    }
}

接続作成プロセスにアクセスできない場合、どのように接続をプロファイル接続にラップしますか? スーパークラスのコードを書き直して、そこにラップしますか? これには、ベースから継承する何百ものクラスを変更する必要があります。スーパーに必要な変更を最小限に抑えて、基本クラスを変更する方法を希望します。

ありがとう、スティーブン

4

1 に答える 1

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 データベース) がない場合) と WPF/Windows サービスの両方で機能します。

于 2011-08-09T17:25:41.857 に答える