2010-09-12 21 views
16

¿La mejor práctica para lanzar la excepción si no se encuentra ninguna entrada en la base de datos?ASP.NET MVC: ¿Dónde arrojar las excepciones?

// CONTROLLER 
public ActionResult Edit(int categoryId, int id) 
{ 
    Product target = Products.GetById(id); 
    if (target == null) throw new HttpException(404, "Product not found"); 

    return View("Edit", target); 
} 

// REPOSITORY 
public Product GetById(int id) 
{ 
    return context.Products.FirstOrDefault(x => x.productId == id); 
} 

o

// CONTROLLER 
public ActionResult Edit(int categoryId, int id) 
{ 
    return View("Edit", Products.GetById(id)); 
} 

// REPOSITORY 
public Product GetById(int id) 
{ 
    Product target = context.Products.FirstOrDefault(x => x.productId == id); 
    if (target == null) throw new HttpException(404, "Product not found with given id"); 

    return target; 
} 

Respuesta

19

Nunca arroje un HttpException desde un repositorio ... es el nivel incorrecto de abstracción. Si no desea que su repositorio para volver null, hacer algo como esto:

// CONTROLLER 
public ActionResult Edit(int categoryId, int id) 
{ 
    try { 
     Product target = Products.GetById(id); 
    } 
    catch(ProductRepositoryException e) { 
     throw new HttpException(404, "Product not found") 
    } 

    return View("Edit", target); 
} 

// REPOSITORY 
public Product GetById(int id) 
{ 
    Product target = context.Products.FirstOrDefault(x => x.productId == id); 
    if (target == null) throw new ProductRepositoryException(); 

    return target; 
} 

su repositorio no debe saber nada de HTTP, pero el controlador puede saber sobre el repositorio. Por lo tanto, lanza una excepción de repositorio desde el repositorio y "traduce" eso a una Excepción de HTTP en el controlador.

+0

Pero luego tengo que crear excepciones personalizadas :(? – ebb

+6

Sí, lo hace. Y eso es lo que * debería * hacer. – blockhead

+0

Voy a crear una excepción personalizada llamado "NotFoundException". Gracias por la respuesta :) – ebb

0

que lanzaba HttpException en el controlador, y volver null desde el repositorio.

+1

Retorno nulo del repositorio .. ese dosent tiene sentido - ¿podría profundizar un poco más por favor? – ebb

+0

Quise decir '... OrDefault();' ... – Nate

3

No arroje una HttpException en el Repositorio, ya que es posible que desee reutilizar ese código en el futuro en un entorno que no sea Http. Lanza tu propia excepción ItemNotFound si requieres al menos un elemento y maneja esa excepción en el Controlador, o devuelve nulo y maneja eso.

Cuestiones relacionadas