2017-07-28 21 views
0

我是一名初学者,对于最佳实践有些怀疑。我的项目是一个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; 
    } 

这可能会导致一些还挺延误?或者我处理我的行动的方式是“好”?谢谢!

+0

你应该总是使用'using'语句和实现'IDisposable'的对象。它与“处理请求”无关,或者因为“它的web API”而变得很好。 – Amy

+0

明白了!谢谢艾米! –

+0

'AsList'会更好。 – mjwills

回答

1

使用using块总是最佳实践。但这可能并不适用于所有情况。在使用WebApi时,如果您的事务分散在多个类或方法中,请考虑使用UnitOfWork。如果您有兴趣,请参考this解答代码示例。

using只配置实施的对象IDisposable;在你的情况下,一个数据库连接。它不处理请求。

关于你的第二个问题,AsList()应该是good practice

关于“控制器的动作”,它不好还是不好。我没有看到任何推迟的原因。

+0

谢谢阿米特!我会读! –

2

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

所以,你应该使用usingSqlConnection。使用静态变量来保持连接实际上很危险,因为连接的实例方法不能保证在多个线程中工作。

至于你用Dapper得到的数据,.AsList()会强制转移结果。这是“我想要记忆中的结果”的明确表述。如果你不使用它,你可能会得到一个IEnumerable<T>,它懒惰地获得每一行。

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