Dapper的良好做法

Nat*_*ros 2 c# dapper asp.net-web-api

我是Dapper的初学者,对最佳做法有一些疑问。我的项目是Asp.net WebApi。

打开连接字符串

线程中,在Controller内以这种方式打开了与数据库的连接,但这是一个简单的项目,并不意味着要成为WebService:

static IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlServerConnString"].ConnectionString);  
Run Code Online (Sandbox Code Playgroud)

但是我发现其他带有using声明的例子:

using (IDbConnection connection = new SqlConnection(stringConnection))
{
    //do something
}
Run Code Online (Sandbox Code Playgroud)

由于此项目是WebApi,因此using语句会更好,因为Dispose请求会更好吗?

上市数据

在上面的同一线程中,显示​​了如何基于static IDbConnection dbproperty 检索列表:

var res = (List<ShippDetails>)db.Query<ShippDetails>(query, new { id });
Run Code Online (Sandbox Code Playgroud)

还是会更好用.AsList()

var res = connection.Query<ShippDetails>(query, new { id }).AsList();
Run Code Online (Sandbox Code Playgroud)

控制器的动作

对于我所有的动作,它看起来像:

[Route("FF")]
    [HttpGet]
    public async Task<HttpResponseMessage> get()
    {         
        var response = new HttpResponseMessage();
        int id = 1;

        var res = (List<ShippDetails>)db.Query<ShippDetails>(query, new { id });

        if (res.Count > 0)
        {
            response = Request.CreateResponse(HttpStatusCode.OK, res);
        }
        else
        {
            response = Request.CreateResponse(HttpStatusCode.NoContent);
        }          

        var task = new TaskCompletionSource<HttpResponseMessage>();
        task.SetResult(response);
        return await task.Task;
    }
Run Code Online (Sandbox Code Playgroud)

可能会导致某种延迟?还是我处理“动作”的方式是“好”?谢谢!

ace*_*ent 6

SqlConnection 它实际上是基于内部连接池的,因此当您创建和处置它们时,您会从池中返回并返回到池中,除非没有足够的连接,例如第一个连接。

因此,您应该将using搭配使用SqlConnection。使用静态变量来保存连接实际上很危险,因为不能保证连接的实例方法可以跨多个线程工作。

至于您通过Dapper获得的数据,.AsList()将强制传输结果。这是“我希望结果存储在内存中”的明确说明。如果您不使用它,则可能会IEnumerable<T>懒得获取每一行。

关于控制器,您正在将结果转换Query<T>List<T>。这可能行不通,您应该坚持使用.AsList()。另一件事是您实际上没有从async控制器中获得任何好处。您应该做的var res = await db.QueryAsync<T>(...).AsList();只是return response;在最后,TaskCompletionSource<T>那里是多余的。