首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Azure网站中使用dapper.net和存储库模式

在Azure网站中使用dapper.net和存储库模式
EN

Code Review用户
提问于 2014-07-29 02:04:26
回答 1查看 4.2K关注 0票数 3

我目前在Azure网站& Azure SQL上,一些文档建议尽可能多地使用异步,因为云服务的延迟更高,流量也有下降的机会,但同时也警告说异步/等待有开销。

我该不该..。

  1. 实现一个IStoreRepository接口(尽管我不知道它是否对我有帮助)?
  2. 使用异步版本的QueryOpenConnection
  3. 我是不是在不同的存储类(如GetByIdGetAll等)中重复了这么多?有没有更优雅的解决方案?

我对dapper.net非常陌生,我想得到一些关于我当前实现的反馈。

StoreRepository

代码语言:javascript
复制
public class StoreRepository
{
    public async Task<Store> GetById(int id)
    {
        using (var conn = await SqlHelper.GetOpenConnectionAsync())
        {
            const string sql = "Select * from Stores where Id = @Id";
            var res = await conn.QueryAsync<Store>(sql, new { Id = id });
            return res.FirstOrDefault();
        }
    }
    ...
}

StoreController

代码语言:javascript
复制
public async Task<ActionResult> Details(int id)
{
    var db = new StoreRepository();
    var store =  await db.GetById(id);
    return View(store);
}

SQLHelper

代码语言:javascript
复制
internal static class SqlHelper
{
    public static readonly string connectionString = ConfigurationManager.ConnectionStrings["ttcn"].ConnectionString;

    public async static Task<DbConnection> GetOpenConnectionAsync()
    {
        return new ProfiledDbConnection(await GetOpenConnection(false), MiniProfiler.Current);
    }
    private async static Task<SqlConnection> GetOpenConnection(bool mars = false)
    {
        var cs = connectionString;
        if (mars)
        {
            SqlConnectionStringBuilder scsb = new SqlConnectionStringBuilder(cs);
            scsb.MultipleActiveResultSets = true;
            cs = scsb.ConnectionString;
        }
        var connection = new SqlConnection(cs);
        await connection.OpenAsync();
        return connection;
    }
}
EN

回答 1

Code Review用户

发布于 2014-07-29 04:36:00

  1. 始终将程序编写为抽象,这意味着它总是倾向于根据接口或抽象类编写代码,而不是特定的实现。所以,IStoreRepository是个好主意。
  2. 如果您不打算更改您的实现,请不要使用抽象或接口。让它简单易懂。
  3. 如果您正在考虑使用mapper和all,那么也可以使用DI容器,这样您就不必这样做: var db =();//创建这样的实例不是一个好主意,相反,注入依赖项对SQL类也是一样的。注入存储库中的依赖项。
  4. 如果您使用EF/nhibernate,那么您的代码将不会重复,因为所有代码都将具有相同的代码类型。您为它们编写一个泛型基类,并传递要从数据库检索它的数据类型。但是如果是手工编写的SQL,这是不可能的,因为您需要为不同类型编写不同的SQL。再说一次这是你的选择。
  5. 使用异步等待来管理SQL连接是很好的,所以您不只是阻止当前工作的线程。从总体上看,开销很小。
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/58337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档