【问题标题】:ASP .Net Identity, Dapper & stored procedures Best PracticesASP .Net Identity、Dapper 和存储过程最佳实践
【发布时间】:2017-07-29 19:07:55
【问题描述】:

我目前正在关注这个guide 来学习 Dapper 微 ORM 和 ASP.NET 身份。我想通过实现一个通用的存储库模式来混合它,这将帮助我进行基本的 CRUD 操作。

这是我的课程:

User.cs

public class User : IUser
{
    public Guid UserId { get; set; }
    public string UserName { get; set; }
    public string PasswordHash { get; set; }
    public string SecurityStamp { get; set; }

    string IUser<string>.Id
    {
        get { return UserId.ToString(); }
    }
}

Repository.cs

public class Repository<T> : IRepository<T> where T : class
{
    public int ExecuteScalar(string query, object arguments)
    {
        var id = 0;

        using (var connection = ConnectionFactory.CreateConnection())
        {
            id = connection.ExecuteScalar<int>(query, arguments, commandType: CommandType.StoredProcedure);
        }

        return id;
    }
}

UserStore.cs

public class UserStore : IUserStore<User>, IUserLoginStore<User>, IUserPasswordStore<User>, IUserSecurityStampStore<User>
{
    private IRepository<User> repository;

    public UserStore(IRepository<User> repository)
    {
        this.repository = repository;
    }

    #region IUserStore
    public virtual Task CreateAsync(User user)
    {
        if (user == null)
            throw new ArgumentNullException("user");

        return Task.Factory.StartNew(() =>
        {
            user.UserId = Guid.NewGuid();
            repository.ExecuteScalar("sp_InsertUser",
                new { UserId = user.UserId, UserName = user.UserName, Password = user.PasswordHash,
                    SecurityStamp = user.SecurityStamp });
        });
    }
}

我没有提供其他方法和类只是为了缩短我的帖子:将创建 SQL 连接的连接工厂以及 UserStore 中接口的方法部分。

我有以下问题:

  1. 有没有办法将User 对象原样传递给ExecuteScalar 方法?而不是每次都输入所有参数。
  2. 将我的 CRUD 操作创建为存储过程真的是最佳实践吗?例如这里sp_InsertUser
  3. 这里的异步方法会导致问题吗?
  4. 如果我想编写一个 SQL 查询并将其传递给 Dapper(将查询添加到 XML 文件并从那里读取它)。我也看到了这个guide,我喜欢一切都是通用的,我可以最小化我的代码并创建一些简洁的东西。调用字符串格式并传递参数是最佳实践吗?

    string.Format("更新 [{0}] SET {1} WHERE {2}", typeof(T).Name, sqlValuePairs, sqlIdPairs)

我真的为这篇长文道歉,但我对此真的很陌生,我正在努力学习这些技术。但是我搜索文章越多,我就越困惑。

【问题讨论】:

    标签: c# asp.net stored-procedures asp.net-identity dapper


    【解决方案1】:
    1. 如果参数名和属性名完全匹配,直接传user即可;但是,请注意,虽然 dapper 可以尝试检查内联文本需要哪些参数,但它不能对存储过程执行此操作,因此它会尝试发送所有内容
    2. 主要是意见和偏好;有像 dapper.contrib 和 dapperextensions 这样的工具可以自动完成这项工作
    3. 您应该更喜欢实际的异步方法,例如 ExecuteScalarAsync
    4. 似乎是一个陈述,而不是一个问题

    对于已编辑的 4:

    1. 好吧,有很多方法可能导致漏洞;但如果您严格控制输入,它可以工作;有时我也做过类似的事情;但请注意,这几乎就是像“dapper.contrib”这样的东西带来的东西

    【讨论】:

    • @Mark 感谢您对 dapper.contrib 的贡献!正如你所说,这正是你想要的! 1-由于 dapper.contrib 不提供此功能,因此也可以使用 dapper 调用存储过程吗? 2-我有一个带有外键约束的表。使用 dapper.contrib 插入记录会导致问题(没有属性)吗?再次感谢您!
    • @NicolasJamal 实际上,除了构建/部署它之外,我还没有接触过“contrib”;它不是我常规工具的一部分,但它的存在很棒
    猜你喜欢
    • 2010-12-28
    • 2017-01-01
    • 2016-03-31
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 2012-02-05
    • 1970-01-01
    相关资源
    最近更新 更多