繼上次分享的.Net Core Project 從零開始 — Miniprofiler針對application進行效能監控,這次要使用Miniprofiler套件將Dapper execute 的 SQL Statement錄製下來。
先看看舊的code
有個缺點,在使用Dapper Query 查資料的時候,Query function都要再自行建立 SQL Connection使用起來滿麻煩的,這次的範例我會把這些初始化SQL Connection抽成共用,讓程式對於資料庫連線更方便使用。
*目前有兩件事要做到的
1. 使用Miniprofiler 將Dapper execute 的 SQL Statement錄製下來
2. 把初始化SQL Connection抽成共用
Step 1: CakeMyBlog.Platform Project 使用Nuget加入套件
1.Dapper
2.Microsoft.VisualStudio.Services.Client
3.MiniProfiler.AspNetCore.Mvc
Step 2: 對 DataAccessService.cs 進行加工,加入初始化function 把 SQL Connection 共用與 MiniProfiler record SQL Statement
/// <summary>
/// 建立資料庫連線
/// </summary>
/// <returns>資料庫連線</returns>
private IDbConnection GetDbConnection()
{
IDbConnection dBConnection;
if (!_enableMiniprofiler)
{
dBConnection = new SqlConnection(_connectionStr);
}
else
{
dBConnection = new ProfiledDbConnection(
new SqlConnection(_connectionStr), MiniProfiler.Current);
}
if (dBConnection.State != ConnectionState.Open)
{
dBConnection.Open();
}
return dBConnection;
}
Step 3: DataAccessService.cs 加入兩個 Query function 查詢多筆資料與單筆資料
/// <summary>
/// 查詢資料
/// </summary>
/// <typeparam name="TReturn">回覆的資料類型</typeparam>
/// <param name="querySql">SQL敘述</param>
/// <param name="param">查詢參數物件</param>
/// <param name="commandType">敘述類型</param>
/// <returns>資料物件</returns>x
public async Task<IEnumerable<TReturn>> QueryAsync<TReturn>(string querySql, object param = null, CommandType commandType = CommandType.Text)
{
using (IDbConnection con = GetDbConnection())
{
return await con.QueryAsync<TReturn>(querySql, param, null, _connectionTimeout, commandType).ConfigureAwait(false);
}
}
/// <summary>
/// 查詢第一筆資料
/// (無結果回傳Null)
/// </summary>
/// <typeparam name="TResult">回傳的資料型態</typeparam>
/// <param name="querySql">SQL敘述</param>
/// <param name="param">查詢參數</param>
/// <param name="commandType">敘述類型</param>
/// <returns>資料物件</returns>
public async Task<TResult> QueryFirstOrDefaultAsync<TResult>(string querySql, object param = null, CommandType commandType = CommandType.Text)
{
using (IDbConnection con = GetDbConnection())
{
return await con.QueryFirstOrDefaultAsync<TResult>(querySql, param, null, _connectionTimeout, commandType).ConfigureAwait(false);
}
}
Final Step: 在對Provider.cs進行調整,呼叫共用的Query Service
來看看效果是怎麼樣
這樣在開發時就會記錄背後實際執行了什麼 SQL Statement,開發階段Debug非常方便又輕鬆。
Conclusion:這次將初始化SQL Connection抽成共用並且在抽共用的同時把要執行的SQL Statement使用Miniprofiler把執行Script 記錄下來,在開發階段對於背後執行的SQL Statement Debug變得非常輕鬆又方便。
Source : .Net Core Project 從零開始 — Miniprofiler record Dapper SQL Statement
.Net Core Project GitHub:Link
參考文章