ASP .Net Identity,Dapper&存储过程最佳实践

时间:2016-07-04 20:34:18

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

我目前正在关注此guide以了解Dapper micro 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(“UPDATE [{0}]         SET {1} WHERE {2}“,typeof(T).Name,sqlValuePairs,sqlIdPairs)

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

1 个答案:

答案 0 :(得分:1)

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

    1. 嗯,有很多方法可能会导致漏洞;但如果你完全控制输入它可以工作;我有时候做过类似的事情;但请注意,这几乎就像&#34; dapper.contrib&#34;带到桌子上