asp.net - 将 ASP.Net MVC 与经典 ADO.Net 结合使用

标签 asp.net asp.net-mvc ado.net

我正在寻找一种使用经典 ADO.Net 访问存储过程的方法,因为我是 ASP.Net MVC 的新手,所以我不知道如何去做。

大多数示例显示使用 ADO.Net Entity Framework 的 CRUD 操作。

最佳答案

您可以拥有一个存储库:

public interface IUsersRepository
{
    public User GetUser(int id);
}

然后实现它:

public class UsersRepository: IUsersRepository
{
    private readonly string _connectionString;
    public UsersRepository(string connectionString)
    {
        _connectionString = connectionString;
    }

    public User GetUser(int id)
    {
        // Here you are free to do whatever data access code you like
        // You can invoke direct SQL queries, stored procedures, whatever 

        using (var conn = new SqlConnection(_connectionString))
        using (var cmd = conn.CreateCommand())
        {
            conn.Open();
            cmd.CommandText = "SELECT id, name FROM users WHERE id = @id";
            cmd.Parameters.AddWithValue("@id", id);
            using (var reader = cmd.ExecuteReader())
            {
                if (!reader.Read())
                {
                    return null;
                }
                return new User
                {
                    Id = reader.GetInt32(reader.GetOrdinal("id")),
                    Name = reader.GetString(reader.GetOrdinal("name")),
                }
            }
        }
    }
}

然后你的 Controller 就可以使用这个存储库:

public class UsersController: Controller
{
    private readonly IUsersRepository _repository;
    public UsersController(IUsersRepository repository)
    {
        _repository = repository;
    }

    public ActionResult Index(int id)
    {
        var model = _repository.GetUser(id);
        return View(model);
    }
}

这样 Controller 就不再依赖于数据访问层的实现:无论您是使用普通的 ADO.NET、NHibernate、EF、其他一些 ORM、调用外部 Web 服务、XML,您都能想到。

现在剩下的就是配置您最喜欢的 DI 框架,以将存储库的正确实现注入(inject)到 Controller 中。如果明天您决定更改数据访问技术,没问题,只需编写 IUsersRepository 接口(interface)的不同实现并重新配置您的 DI 框架即可使用它。无需触及 Controller 逻辑。

您的 MVC 应用程序不再与数据存储方式相关。这也使得对 Controller 进行独立单元测试变得更加容易,因为它们不再与特定数据源紧密耦合。

关于asp.net - 将 ASP.Net MVC 与经典 ADO.Net 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6694098/

相关文章:

javascript - 从母版页注入(inject)的客户端脚本 block 执行 ASP.NET 回发后运行 Javascript

asp.net - 我可以修改 Global.asax 之外的 MVC 路由吗?

c# - 内部声明变量的 T-SQL 参数化查询?

c# - 表没有得到更新,当使用 executeNonquery

c# - DataGrid ButtonColumns 的空元素 ID

javascript - 如何解决这个ajax jquery错误?

c# - 将 Eval 的值从 int 转换为 string

asp.net-mvc - ASP.NET MVC 2 编辑器模板中字段的渲染标签

asp.net-mvc - 允许用户选择多个项目的方法 - ASP.Net MVC

.net - ADO .Net - 如何在具有多个 IP 地址的系统上的 SqlConnection 中指定源 IP 地址