3

我查看了几个存储库模式示例,但似乎无法确定数据库访问发生在哪里。我看到的所有示例似乎都预期使用实体框架,这超出了我正在做的小项目的范围。我正在尝试创建一个具有 5 个左右模型/​​控制器的 WebAPI 服务。

基本上,我的问题是:如何将我的数据库调用集成到项目中以及在哪里?我是否应该直接从控制器调用 DAL 方法,这似乎是反模式?控制器中的数据库上下文是如何在示例中使用 EF 完成的,但我不知道通过属性或构造函数实际传递给控制器​​的位置。

编辑:

也许我不够清楚。我为此道歉。我没有使用实体框架。我对使用 EF 没有兴趣。我不会在我的项目中的任何时候使用它。

4

2 回答 2

3

所以你必须直接使用ADO.NET,对吗?

这是一个示例回购:

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"];
    }
}

它来自我的ADO.NET,正确的方式文章。

于 2013-06-19T11:31:58.680 回答
1

如果要在控制器中使用实体框架数据,则可以使用控制反转容器框架将其传递给构造函数。该框架将自动创建一个数据上下文实例,然后将一个 WebApi 控制器实例传递给它刚刚创建的数据上下文。

这是一个允许这样做的框架示例:

http://nuget.org/packages/Autofac.WebApi/

https://code.google.com/p/autofac/w/list

编辑1:

如果您不想使用实体框架,则采用相同的方法,但不是将数据上下文传递到 WebApi 控制器,而是可以传递 ADO.NET 连接。

编辑2:

您应该查看工作单元和存储库模式。工作单元负责管理您的数据库连接/数据上下文/等,还将创建存储库的实例。然后,每个存储库将管理每个表中的实体以及您如何读取/更新这些实体。

然后我的初始响应适用,但不是数据上下文,而是您的工作单元类的一个实例。

这些模式以及在 stackoverflow 和互联网上使用 Autofac 有很多很好的例子,所以我不会在这里重复它们。请注意,我提到了 Autofac,但可以使用任何支持 ASP.NET WebApi 的 IoC 容器。

于 2013-06-19T05:13:23.277 回答