的组合的一些问题我一直在试验用于处理业务逻辑的轻量级解决方案。它包含一个以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包装) - 有关改进此设置的任何建议?