我正在寻找一种使用经典 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/