【发布时间】: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 中接口的方法部分。
我有以下问题:
- 有没有办法将
User对象原样传递给ExecuteScalar方法?而不是每次都输入所有参数。 - 将我的 CRUD 操作创建为存储过程真的是最佳实践吗?例如这里
sp_InsertUser。 - 这里的异步方法会导致问题吗?
-
如果我想编写一个 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