ASP.NET MVC - куда бросать исключения? - PullRequest
17 голосов
/ 12 сентября 2010

Рекомендуется генерировать исключение, если в базе данных не найдено записей?

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

или

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

Ответы [ 3 ]

24 голосов
/ 12 сентября 2010

Никогда не выбрасывайте HttpException из хранилища ... это неправильный уровень абстракции.Если вы не хотите, чтобы ваш репозиторий возвращал null, выполните что-то вроде этого:

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

Ваш репозиторий не должен ничего знать о HTTP, но ваш контроллер может знать о репозитории.Таким образом, вы выбрасываете исключение хранилища из хранилища и «переводите» это в исключение HTTP в контроллере.

3 голосов
/ 12 сентября 2010

Не создавайте исключение HttpException в репозитории, так как вы можете захотеть повторно использовать этот код в будущем в среде без Http. Бросьте свое собственное исключение ItemNotFound, если вам требуется хотя бы один элемент и обработайте это исключение в контроллере, или верните ноль и обработайте это.

0 голосов
/ 12 сентября 2010

Я бы добавил HttpException в контроллер и вернул бы null из хранилища.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...