net mvc httpconfiguration from convert asp asax asp.net-mvc exception

httpconfiguration - ASP.NET MVC-¿Dónde lanzar las excepciones?



httpconfiguration.net core (3)

¿Mejores prácticas para lanzar la excepción si no se encuentra ninguna entrada en la base de datos?

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


No lance una HttpException en el Repositorio, ya que puede querer reutilizar ese código en el futuro en un entorno que no sea Http. Lance su propia excepción de ItemNotFound si necesita al menos un artículo y maneja esa excepción en el Controlador, o devuelva el valor nulo y maneje eso.


Nunca lance una HttpException desde un repositorio ... es el nivel incorrecto de abstracción. Si no desea que su repositorio devuelva null , haga 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 acerca de HTTP, pero su controlador puede saber sobre el repositorio. Así que lanza una excepción de repositorio desde el repositorio, y "traduce" eso a una excepción de HTTP en el controlador.


HttpException en el controlador y devolvería el null desde el repositorio.