1

我有一个 MVC3 项目,其中一个模型被构建为一个单独的类库项目,以便在其他应用程序中重用。

我正在使用 mini-profiler,并希望找到一种方法来分析从此类库中生成的数据库连接和查询,并将结果返回给 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 应用程序或 mini-profiler 一无所知。

我想到的一种方法是IDbConnection Connection在外部模型上有一个字段,然后在ProfiledDbConnection调用任何模型的方法之前将一个对象传递给该字段。然后,该模型将使用该字段中的任何内容进行数据库连接,并且我应该在 MVC3 前端获得一些分析结果。

但是,我不确定这是否可行,或者这是否是最好的方法。我有没有更好的方法?

4

1 回答 1

2

ProfiledDbConnection不是小巧玲珑:它是迷你分析器。我们不提供任何可以接管所有连接创建的魔法;我唯一能建议的就是在你的库中公开一个可以从外部订阅的事件——所以中的创建代码可能看起来有点像:

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 回答