我查看了几个存储库模式示例,但似乎无法确定数据库访问发生在何处。我看到的所有示例似乎都预期会使用 Entity Framework ,这超出了我正在做的小项目的范围。我正在尝试创建一个具有 5 个左右模型/ Controller 的 WebAPI 服务。
基本上,我的问题是:如何将我的数据库调用集成到项目中以及在哪里?我是否应该直接从 Controller 调用 DAL 方法,这似乎是反模式的? Controller 中的数据库上下文是如何使用示例中的 EF 完成的,但我不知道通过属性或构造函数实际传递给 Controller 的 where 。
编辑:
也许我不够清楚。我为此道歉。我没有使用 Entity Framework 。我对使用 EF 没有兴趣。我不会在我的项目中的任何时候使用它。
最佳答案
所以你必须直接使用 ADO.NET,对吧?
这是一个示例 repo 协议(protocol):
public class UserRepository : Repository<User>
{
public UserRepository(AdoNetContext context) : base(context)
{
}
public void Create(User user)
{
using (var command = _connection.CreateCommand())
{
command.CommandText = @"INSERT INTO Users (CompanyId, FirstName) VALUES(@companyId, @firstName)";
command.AddParameter("companyId", user.CompanyId);
command.AddParameter("firstName", user.FirstName);
command.ExecuteNonQuery();
}
//todo: Get identity. Depends on the db engine.
}
public void Update(User user)
{
using (var command = _connection.CreateCommand())
{
command.CommandText = @"UPDATE Users SET CompanyId = @companyId WHERE Id = @userId";
command.AddParameter("companyId", user.CompanyId);
command.AddParameter("userId", user.Id);
command.ExecuteNonQuery();
}
}
public void Delete(int id)
{
using (var command = _connection.CreateCommand())
{
command.CommandText = @"DELETE FROM Users WHERE Id = @userId";
command.AddParameter("userId", id);
command.ExecuteNonQuery();
}
}
public IEnumerable<User> FindUsers(string firstName)
{
using (var command = _connection.CreateCommand())
{
command.CommandText = @"SELECT * FROM Users WHERE CompanyId = @companyId AND FirstName LIKE @firstName";
command.AddParameter("companyId", LoggedInUser.companyId);
command.AddParameter("firstName", firstName + "%");
return ToList(command);
}
}
public IEnumerable<User> FindBlocked()
{
using (var command = _connection.CreateCommand())
{
command.CommandText = @"SELECT * FROM Users WHERE Status = -1";
return ToList(command);
}
}
protected void Fill(IDataRecord record, User user)
{
user.FirstName = (string)record["FirstName"];
user.Age = (int)record["Age"];
}
}
来 self 的 ADO.NET, the right way文章。
关于design-patterns - 存储库模式中的数据库调用在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17183143/