Разделение основных задач Asp.net с помощью уровня обслуживания

У меня возникла проблема с тем, как лучше всего разработать уровень обслуживания и использовать их в своем контроллере. Вот что меня беспокоит.

В настоящее время я использую это для удаления категорий

    [HttpPost]
    [ValidateAntiForgeryToken]
    public IActionResult Delete(List<Guid> ids)
    {
        if(ids == null || ids.Count == 0)
            return RedirectToAction("List");

        _categoryService.DeleteCategories(_categoryService.GetCategoryByIds(ids));
        _categoryService.SaveChanges();

        return RedirectToAction("List");
    }

Меня беспокоит, стоит ли мне просто передать идентификаторы DeleteCategories, а затем вызвать GetCategoryByIds внутри DeleteCategories. И если я собираюсь удалить только 1 категорию, лучше ли добавить другой метод, например DeleteCategory, тогда в контроллере проверьте длину идентификаторов, и если она всего 1, используйте вместо этого DeleteCategory,


person markoverflow    schedule 29.11.2016    source источник


Ответы (2)


Меня беспокоит, следует ли мне просто передать идентификаторы в DeleteCategories, а затем вызвать GetCategoryByIds внутри DeleteCategories.

Просто передайте ID методу DeleteCategories. Я бы даже не стал звонить GetCategoryByIds внутри него. Нет необходимости запрашивать в базе данных всю остальную информацию о категории, если вы просто планируете ее удалить.

И если я собираюсь удалить только 1 категорию, лучше добавить еще один метод, например DeleteCategory, тогда в контроллере проверьте длину идентификаторов, и если она всего 1, используйте вместо этого DeleteCategory

Я бы не стал создавать другой метод. Вы можете просто передать список с одним значением. Метод DeleteCategory не может сделать ничего такого, чего вы уже не можете сделать с DeleteCategories.

person Will Ray    schedule 29.11.2016
comment
Привет, я не понимаю, что вы имеете в виду под Нет необходимости запрашивать в базе данных всю остальную информацию о категории, если вы просто планируете ее удалить. Я использую структуру сущностей, как я могу удалить, не запрашивая базу данных для удаления объекта? - person markoverflow; 29.11.2016
comment
@markoverflow Как правило, лучше избегать запросов к базе данных, если они вам не нужны. Для удаления нужен только первичный ключ. В этом вопросе SO о том, как это сделать. - person Will Ray; 29.11.2016

Все зависит от вашей бизнес-логики

Если у пользователя есть возможность выбрать более одной категории и удалить их сразу, тогда имеет смысл, чтобы метод удаления принимал список идентификаторов и удалял их все, если пользователь может удалить только одну категорию, тогда это должно быть DeleteById(int categoryId).

Что касается вызова GetCategoryByIds, это все еще зависит от вашей логики. Если у вас есть какая-то авторизация, вы должны сначала получить категорию, убедиться, что у пользователя есть доступ для удаления предоставленной категории и продолжить, если все в порядке.

Замечание о вашем коде, ваша служба должна иметь логику для манипулирования данными, инкапсулированную внутри, вы не должны открывать метод SaveChanges и передавать управление контроллеру для его вызова или, по крайней мере, реализовать шаблон Unit of Work, если вам нужно реализовать какая-то сделка.

person Haitham Shaddad    schedule 29.11.2016