【问题标题】:Asp.net core separation of concern using service layer使用服务层的 Asp.net 核心分离关注点
【发布时间】:2017-04-12 23:54:34
【问题描述】:

我对设计服务层并在控制器中使用它们的最佳方法有疑问。这是我的担忧。

目前我正在使用它来删除类别

    [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,然后在 DeleteCategories 中调用 GetCategoryByIds。如果我只想删除 1 个类别,是否最好添加另一种方法,例如 DeleteCategory 然后在控制器中检查 id 的长度,如果它只有 1,请改用 DeleteCategory

【问题讨论】:

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


    【解决方案1】:

    我关心的是我是否应该只将 ID 传递给 DeleteCategories,然后在 DeleteCategories 中调用 GetCategoryByIds。

    只需将 ID 传递给 DeleteCategories 方法。我什至不会在里面打电话给GetCategoryByIds。如果您只是打算删除它,则无需查询数据库以获取所有其他类别信息。

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

    我不会费心创建另一种方法。您可以只传递一个包含一个值的列表。 DeleteCategory 方法没有任何事情可以做到,而 DeleteCategories 已经无法做到。

    【讨论】:

    • 您好,我不明白您的意思如果您只是打算删除它,则无需查询数据库以获取所有其他类别信息。 我正在使用实体框架,如何通过不查询要删除的实体的数据库来删除?
    • @markoverflow 作为一般规则,如果不需要,最好避免查询数据库。只需要主键即可进行删除。 this SO question 中有几个例子说明如何做到这一点。
    【解决方案2】:

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

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

    至于调用GetCategoryByIds,还是看你的逻辑了.

    关于你的代码的注释,你的服务应该有内部封装的数据操作逻辑,你不应该公开SaveChanges方法并将控制权交给控制器来调用它,或者至少实现工作单元模式如果您需要执行某种事务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-17
      • 2012-03-20
      • 1970-01-01
      • 2015-12-12
      • 2012-07-11
      • 2017-08-09
      • 1970-01-01
      • 2015-11-25
      相关资源
      最近更新 更多