Asp.net 关于ADO.NET、Dapper QueryAsync和Spile.ADO组合的几个问题

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

我一直在尝试一种轻量级的解决方案来处理我的业务逻辑。它由一个普通的ADO.NET连接组成,该连接通过扩展并由监视。此设置的用例将是一个web应用程序,它必须为每个请求异步处理少量查询。下面是我在MVC控制器中设置的一个简单实现

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()
    的情况下,我们要求我们拥有的内部工厂创建一个连接,当我们获得该连接时,我们将其包装,然后将其返回给原始调用方
  • 对。Spile不会将异步请求转换为阻塞请求。尽管如此,我们始终坚持异步链。如果您感兴趣,所讨论的代码是
  • 很少。本质上,使用这样的装饰器模式只会向调用堆栈添加一到两个帧。与请求生命周期中执行的大多数操作相比,观察此处发生的情况的时间非常少
  • 你所拥有的看起来很棒。唯一的建议是,也许我们可以编写代码来建造工厂。此代码意味着您可以将连接字符串等移到web.config