design-patterns - 存储库模式中的数据库调用在哪里?

标签 design-patterns asp.net-web-api repository-pattern

我查看了几个存储库模式示例,但似乎无法确定数据库访问发生在何处。我看到的所有示例似乎都预期会使用 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/

相关文章:

c# - 抽象工厂设计模式来创建对象?为什么我们不能只使用 new 运算符?

javascript - 在Web Api中获取Js FormData()

c# - 当 json 负载无效时,不会调用自定义 ActionFilterAttribute

c# - 一个 DbContext Instance 跨越多个 Repositories

c# - 存储库模式 - 使其可测试、DI 和 IoC 友好且 IDisposable

c# - 正确的聚合根是什么?

node.js - Node js 中的“条件 hell ”

design-patterns - Redis中持久队列的 worker 管理

java - 在 Java 中创建无状态实用程序类的最佳实践是什么

asp.net-web-api - 内存中 HTTP 服务器 Asp.net WebAPI