使用服务层关注Asp.net核心分离

时间:2016-11-29 05:06:29

标签: asp.net asp.net-core service-layer onion-architecture

我遇到的问题是设计我的服务层并在我的控制器中使用它们的最佳方法是什么。这是我的担忧。

目前我正在使用此功能删除类别

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

我担心的是,我应该将ID传递给DeleteCategories,然后拨打GetCategoryByIds内的DeleteCategories。如果我只删除1个类别,最好是添加另一个方法,如DeleteCategory,然后在控制器中检查ID的长度,如果只有1,请使用DeleteCategory相反,

2 个答案:

答案 0 :(得分:3)

  

我担心的是我应该将ID传递给DeleteCategories然后调用DeleteCategories中的GetCategoryByIds。

只需将ID传递给DeleteCategories方法即可。我甚至不打扰在其中调用GetCategoryByIds。如果您只是计划删除它,则无需在数据库中查询所有其他类别信息。

  

如果我只删除1个类别,最好添加另一个方法,比如DeleteCategory,然后在控制器中检查id的长度,如果它只是1,请改用DeleteCategory

我不会为创建另一种方法而烦恼。您只需传递一个包含一个值的列表即可。没有DeleteCategory方法可以执行任何操作,您已经无法使用DeleteCategories

答案 1 :(得分:0)

这完全取决于您的业务逻辑

如果用户可以选择多个类别并一次删除它们,那么让delete方法接受ID列表并将其全部删除是有意义的,如果用户只能删除一个类别,那么它应该是DeleteById(int categoryId)

至于调用GetCategoryByIds,仍然取决于你的逻辑,如果你有某种授权,那么你必须首先检索类别,确保用户有权删除提供的类别并继续进行,如果一切很好。

关于你的代码的说明,你的服务应该有封装在里面的数据操作的逻辑,你不应该公开SaveChanges方法并给控制器控制它来调用它,或者至少实现单元的如果您需要实施某种交易,则需要工作模式。