2011-07-14 15 views
27

Estoy buscando una forma de acceder a los procedimientos almacenados utilizando Classic ADO.Net, ya que soy nuevo en ASP.Net MVC. No sé cómo hacerlo.Uso de ASP.NET MVC con Classic ADO.Net

La mayoría de los ejemplos muestran operaciones CRUD utilizando el marco de Entidad ADO.Net.

+1

acaba de vincular estos dos artículos, juntos. http://stackoverflow.com/questions/2243898/displaying-standard-datatables-in-mvc – yedevtxt

Respuesta

49

Usted podría tener un repositorio:

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

luego implementan:

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")), 
       } 
      } 
     } 
    } 
} 

y luego el controlador podría utilizar este repositorio:

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); 
    } 
} 

De esta manera el controlador hay Depende más de la implementación de su capa de acceso a datos: ya sea que esté utilizando ADO.NET simple, NHibernate, E F, algún otro ORM, llamando a un servicio web externo, XML, lo que sea.

Ahora todo lo que queda es configurar su marco de DI favorito para inyectar la implementación adecuada del repositorio en el controlador. Si mañana decide cambiar su tecnología de acceso a datos, no hay problema, simplemente escriba una implementación diferente de la interfaz IUsersRepository y reconfigure su marco DI para usarlo. No es necesario tocar la lógica de tu controlador.

Su aplicación MVC ya no está vinculada a la forma en que se almacenan los datos. Esto hace que sea más fácil probar sus controladores en forma aislada ya que ya no están estrechamente acoplados a una fuente de datos particular.

+5

Excelente enfoque: combínelo con Dapper y puede ahorrarse otro bote cargado de código de asignación de izquierda a derecha aburrido e increíble ... –

+1

@marc_s, sí, de mis experimentos Dapper parece una gran luz- peso ORM. Ya lo estoy considerando para mi próximo proyecto. Me estoy enfermando un poco con NHibernate. –

+0

muy, muy buena explicación. Realmente aprecio la manera en que combina el patrón de diseño del repositorio y el estilo puro de Ado.net. Gracias @Darin. –

9

Eche un vistazo a Dapper-dot-net - es lo que impulsa este sitio - excelente, liviano, basado en ADO.NET puro, admite procedimientos almacenados muy bien - ¡no puedo decir suficientes cosas buenas sobre él!

2

ASP.NET MVC funciona con cualquier marco de base de datos que desee utilizar. Puede recuperar sus datos de la forma que prefiera (como ADO.NET clásico) y pasar el modelo de datos resultante a la vista. Solo tiene que especificar el tipo de modelo en la Vista para que coincida con el objeto que le está pasando.

1

Si sabe cómo hacerlo con ADO.NET, puede hacerlo en ASP.NET MVC (tenga en cuenta que estos marcos son completamente diferentes no tienen dependencia entre sí).

Puede encapsular su código de DataAccess en Repositorios y usar esos Repositorios, en Controladores;

+0

Podría darme cualquier enlace de referencia. @alexanderb –