Dapper的最佳实践
我是一名初学者,对于最佳实践有些怀疑。我的项目是一个Asp.net WebApi。Dapper的最佳实践
开放连接字符串
在this线程与数据库的连接打开这个样子,控制器里面,但它是一个简单的项目,并不意味着是一个WebService:
static IDbConnection db = new SqlConnection(ConfigurationManager.ConnectionStrings["SqlServerConnString"].ConnectionString);
但我发现其他的例子有using
声明:
using (IDbConnection connection = new SqlConnection(stringConnection))
{
//do something
}
因为这个项目是一个WebApi的使用声明会更好cu'z它会Dispose
的要求?
清单数据
在同一个线程上面显示了如何基于static IDbConnection db
属性检索列表:
var res = (List<ShippDetails>)db.Query<ShippDetails>(query, new { id });
或将要更好地使用.AsList()
?
var res = connection.Query<ShippDetails>(query, new { id }).AsList();
控制器
我所有的行动不言而喻等的作用:
[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;
}
这可能会导致一些还挺延误?或者我处理我的行动的方式是“好”?谢谢!
使用using
块总是最佳实践。但这可能并不适用于所有情况。在使用WebApi时,如果您的事务分散在多个类或方法中,请考虑使用UnitOfWork。如果您有兴趣,请参考this解答代码示例。
using
只配置实施的对象IDisposable
;在你的情况下,一个数据库连接。它不处理请求。
关于你的第二个问题,AsList()
应该是good practice。
关于“控制器的动作”,它不好还是不好。我没有看到任何推迟的原因。
谢谢阿米特!我会读! –
SqlConnection
实际上是基于一个内部连接池,因此当您创建并处理它们时,除非没有足够的连接时,您才会从池中取出并返回池。第一个连接。
所以,你应该使用using
与SqlConnection
。使用静态变量来保持连接实际上很危险,因为连接的实例方法不能保证在多个线程中工作。
至于你用Dapper得到的数据,.AsList()
会强制转移结果。这是“我想要记忆中的结果”的明确表述。如果你不使用它,你可能会得到一个IEnumerable<T>
,它懒惰地获得每一行。
关于您的控制器,您要将Query<T>
的结果转换为List<T>
。这可能行不通,你应该坚持.AsList()
。另一件事是,你实际上没有在你的控制器中获得async
的任何好处。你应该在var res = await db.QueryAsync<T>(...).AsList();
和return response;
最后,TaskCompletionSource<T>
是多余的那里。
你应该总是使用'using'语句和实现'IDisposable'的对象。它与“处理请求”无关,或者因为“它的web API”而变得很好。 – Amy
明白了!谢谢艾米! –
'AsList'会更好。 – mjwills