1

私は MVC3 プロジェクトを持っており、モデルの 1 つは別のクラス ライブラリ プロジェクトとして構築されており、他のアプリケーションで再利用できます。

ミニプロファイラーを使用していますが、このクラス ライブラリから作成されたデータベース接続とクエリをプロファイリングし、結果を MVC3 アプリケーションに返す方法を見つけたいと考えています。

現在、私の MVC3 アプリでは、既存のモデルは次のヘルパー クラスを使用して接続を取得します。

public class SqlConnectionHelper
{
    public static DbConnection GetConnection()
    {
        var dbconn = new SqlConnection(ConfigurationManager.ConnectionStrings["db"].ToString());
        return new StackExchange.Profiling.Data.ProfiledDbConnection(dbconn, MiniProfiler.Current);
    }
}

外部モデルは、MVC3 アプリケーションやミニプロファイラーについて何も知らないため、この関数を呼び出すことはできません。

私が考えた 1 つの方法はIDbConnection Connection、外部モデルにフィールドをProfiledDbConnection作成し、モデルのメソッドを呼び出す前に、このフィールドにオブジェクトを渡すことです。モデルは、このフィールドにあるものをデータベース接続に使用し、MVC3 フロントエンドでプロファイリングされた結果を取得する必要があります。

ただし、これが機能するかどうか、またはこれが最善の方法であるかどうかはわかりません。私が行方不明になっているより良い方法はありますか?

4

1 に答える 1

2

ProfiledDbConnectiondapper ではありません: ミニプロファイラーです。すべての接続作成を引き継ぐことができる魔法は提供していません。私が提案できる唯一のことは、外部からサブスクライブできるライブラリ内のイベントを公開することです。そのため、ライブラリ内の作成コードは次のようになります。

public static event SomeEventType ConnectionCreated;
static DbConnection CreateConnection() {
    var conn = ExistingDbCreationCode();
    var hadler = ConnectionCreated;
    if(handler != null) {
        var args = new SomeEventArgsType { Connection = conn };
        handler(typeof(YourType), args);
        conn = args.Connection;
    }
    return conn;
}

これにより、外部コードがやりたいことを実行できるようになります。たとえば、次のようになります。

YourType.ConnectionCreated += (s,a) => {
    a.Connection = new StackExchange.Profiling.Data.ProfiledDbConnection(
        a.Connection, MiniProfiler.Current);
};
于 2012-09-21T06:08:47.010 に答える