的組合的一些問題我一直在試驗用於處理業務邏輯的輕量級解決方案。它包含一個以Dapper擴展的vanilla ADO.NET連接,並由Glimpse.ADO進行監視。此設置的用例將是一個Web應用程序,它必須按請求異步處理少數幾個查詢。在MVC控制器中簡單實現我的設置。有關ADO.NET,Dapper QueryAsync和Glimpse.ADO
public class CatsAndDogsController : Controller
{
public async Task<ActionResult> Index()
{
var fetchCatsTask = FetchCats(42);
var fetchDogsTask = FetchDogs(true);
await Task.WhenAll(fetchCatsTask, fetchDogsTask);
ViewBag.Cats = fetchCatsTask.Result;
ViewBag.Dogs = fetchDogsTask.Result;
return View();
}
public async Task<IEnumerable<Cat>> FetchCats(int breedId)
{
IEnumerable<Cat> result = null;
using (var connection = CreateAdoConnection())
{
await connection.OpenAsync();
result = await connection.QueryAsync<Cat>("SELECT * FROM Cat WHERE BreedId = @bid;", new { bid = breedId });
connection.Close();
}
return result;
}
public async Task<IEnumerable<Dog>> FetchDogs(bool isMale)
{
IEnumerable<Dog> result = null;
using (var connection = CreateAdoConnection())
{
await connection.OpenAsync();
result = await connection.QueryAsync<Dog>("SELECT * FROM Dog WHERE IsMale = @im;", new { im = isMale });
connection.Close();
}
return result;
}
public System.Data.Common.DbConnection CreateAdoConnection()
{
var sqlClientProviderFactory = System.Data.Common.DbProviderFactories.GetFactory("System.Data.SqlClient");
var dbConnection = sqlClientProviderFactory.CreateConnection();
dbConnection.ConnectionString = "SomeConnectionStringToAwesomeData";
return dbConnection;
}
}
我對在CreateAdoConnection()
方法中創建連接有一些疑問。我認爲以下是幕後發生的事情。
對sqlClientProviderFactory.CreateConnection()
的調用返回System.Data.SqlClient.SqlConnection
的實例作爲System.Data.Common.DbConnection
傳遞。此時Glimpse.ADO.AlternateType.GlimpseDbProviderFactory
在Glimpse.Ado.AlternateType.GlimpseDbConnection
的實例中啓動幷包裝此連接,該實例也作爲System.Data.Common.DbConnection
傳遞。最後,這個連接由Dapper庫以其查詢方法間接擴展,其中有QueryAsync<>()
方法用於提取貓和狗。
的問題:
- 是上面的假設是正確的?
- 如果我通過此連接使用Dapper的異步方法 - 或者使用此連接的
CreateCommand()
方法創建System.Data.Common.DbCommand
並使用它的異步方法 - 那麼這些內部調用總是最終使用這些方法的vanilla異步實現,就像Microsoft爲它們編寫的那樣System.Data.SqlClient.SqlConnection
和System.Data.SqlClient.SqlCommand
?而不是這些方法實際阻塞的其他實現? - 與此設置相比,直接返回新的
System.Data.SqlClient.SqlConnection
會損失多少perf? (因此,沒有Glimpse.ADO包裝) - 有關改進此設置的任何建議?