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 db
property 检索列表:
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)
可能会导致某种延迟?还是我处理“动作”的方式是“好”?谢谢!
SqlConnection
它实际上是基于内部连接池的,因此当您创建和处置它们时,您会从池中返回并返回到池中,除非没有足够的连接,例如第一个连接。
因此,您应该将using
搭配使用SqlConnection
。使用静态变量来保存连接实际上很危险,因为不能保证连接的实例方法可以跨多个线程工作。
至于您通过Dapper获得的数据,.AsList()
将强制传输结果。这是“我希望结果存储在内存中”的明确说明。如果您不使用它,则可能会IEnumerable<T>
懒得获取每一行。
关于控制器,您正在将结果转换Query<T>
为List<T>
。这可能行不通,您应该坚持使用.AsList()
。另一件事是您实际上没有从async
控制器中获得任何好处。您应该做的var res = await db.QueryAsync<T>(...).AsList();
只是return response;
在最后,TaskCompletionSource<T>
那里是多余的。
归档时间: |
|
查看次数: |
3232 次 |
最近记录: |