Asp.net 关于ADO.NET、Dapper QueryAsync和Spile.ADO组合的几个问题
我一直在尝试一种轻量级的解决方案来处理我的业务逻辑。它由一个普通的ADO.NET连接组成,该连接通过扩展并由监视。此设置的用例将是一个web应用程序,它必须为每个请求异步处理少量查询。下面是我在MVC控制器中设置的一个简单实现Asp.net 关于ADO.NET、Dapper QueryAsync和Spile.ADO组合的几个问题,asp.net,ado.net,dapper,glimpse,Asp.net,Ado.net,Dapper,Glimpse,我一直在尝试一种轻量级的解决方案来处理我的业务逻辑。它由一个普通的ADO.NET连接组成,该连接通过扩展并由监视。此设置的用例将是一个web应用程序,它必须为每个请求异步处理少量查询。下面是我在MVC控制器中设置的一个简单实现 public class CatsAndDogsController : Controller { public async Task<ActionResult> Index() { var fetchCatsTask = Fe
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;
}
}
公共类CatsAndDogsController:控制器
{
公共异步任务索引()
{
var fetchCatsTask=FetchCats(42);
var fetchDogsTask=FetchDogs(真);
等待任务。WhenAll(fetchCatsTask,fetchDogsTask);
ViewBag.Cats=fetchCatsTask.Result;
ViewBag.Dogs=fetchDogsTask.Result;
返回视图();
}
公共异步任务FetchCats(int)
{
IEnumerable结果=null;
使用(var connection=CreateAdoConnection())
{
等待连接。OpenAsync();
result=wait connection.QueryAsync(“SELECT*FROM Cat WHERE BreedId=@bid;”,new{bid=BreedId});
connection.Close();
}
返回结果;
}
公共异步任务FetchDogs(bool-isMale)
{
IEnumerable结果=null;
使用(var connection=CreateAdoConnection())
{
等待连接。OpenAsync();
result=wait connection.querysync(“SELECT*FROM Dog,其中IsMale=@im;”,new{im=IsMale});
connection.Close();
}
返回结果;
}
public System.Data.Common.DbConnection CreateAdoConnection()
{
var sqlClientProviderFactory=System.Data.Common.DbProviderFactories.GetFactory(“System.Data.SqlClient”);
var dbConnection=sqlClientProviderFactory.CreateConnection();
dbConnection.ConnectionString=“SomeConnectionStringToAwesomeData”;
返回数据库连接;
}
}
关于在CreateAdoConnection()
方法中创建连接,我有一些问题。我想以下是在幕后发生的
调用sqlClientProviderFactory.CreateConnection()
返回作为System.Data.SqlClient.SqlConnection
传递的System.Data.Common.DbConnection的实例。此时,scape.ADO.AlternateType.GlimpseDbProviderFactory
将此连接导入并封装在scape.ADO.AlternateType.GlimpseDbConnection
的实例中,该实例也作为System.Data.Common.DbConnection
传递。最后,Dapper库及其查询方法间接扩展了这种连接,其中包括用于获取猫和狗的QueryAsync()
方法
问题是:
上述假设正确吗
如果我将Dapper的异步方法用于此连接,或者使用此连接的CreateCommand()
方法创建System.Data.Common.DbCommand
,并使用它的异步方法-这些调用在内部是否总是使用这些方法的普通异步实现,就像Microsoft为System.Data.SqlClient.SqlConnection
和System.Data.SqlClient.SqlCommand
编写的那样?而不是这些方法的其他一些实际阻塞的实现
与直接返回新的System.Data.SqlClient.SqlConnection
相比,此设置会损失多少性能?(因此,没有scape.ADO包装器)
对改进这个设置有什么建议吗
是的,差不多<代码>GlimpseDbProviderFactory
包装/装饰/代理所有注册工厂。然后,我们将通过的任何调用传递到我们包装的工厂(在本例中为SQL Server)。在CreateConnection()
的情况下,我们要求我们拥有的内部工厂创建一个连接,当我们获得该连接时,我们将其包装,然后将其返回给原始调用方