【问题标题】:N-layered Web Api using automapper to pass DTOs between controller and service layers errorN 层 Web Api 使用 automapper 在控制器和服务层之间传递 DTO 错误
【发布时间】:2018-07-26 06:28:50
【问题描述】:

我是 WebApi 和分层架构的新手。下面是我整个项目的结构:

我想知道如何将实体从控制器传递到服务,然后再从服务返回到控制器

下面是我在控制器里写的

以下是我在服务中写的

下面是 DTO 类

以下是错误

如何解决这些错误?

【问题讨论】:

    标签: c# asp.net-core automapper asp.net-core-webapi dto


    【解决方案1】:

    这里有很多问题。我认为它们主要源于您的 DTO 和模型类之间的混淆。

    所以这些错误都是因为您声明您的 ITodoService 使用/返回 TodoItem 实例,但您使用的是 TodoItemDto 代替:

    1. TodoService.GetAllTodoService.GetByidTodoService.Delete 在接口上都需要TodoItem,但是您在TodoService 中实现它们时使用了TodoitemDto。 (TodoService.cs 第 13 行的三个错误)。
    2. 您根本没有从TodoService.Delete 返回值。返回的值应该是TodoItem,而不是TodoItemDto。 (TodoService.cs,第 26 行)
    3. _dorepo.Delete() 返回无效。您不能将其分配给变量。我不能帮你,因为我不知道你打算做什么。 (TodoService.cs,第 29 行)
    4. 因为TodoService.GetAll 被错误地定义为返回TodoItemDto,所以无法返回来自_dorepo.GetAll 的值。解决方法是更改​​函数声明以返回TodoItem,如上面第 1 点所述。 (TodoService.cs,第 37 行)

    您没有显示TodoController 的代码,但我猜最后两个错误是相似的。

    我的建议是执行以下操作之一: 1. 扔掉 DTO 对象。它们是个好主意,但如果它们只是为了让你感到困惑,它们就没有真正的目的,或者 2. 制作您在模型对象上实现的 DTO 接口。所有其他类和接口都尽可能仅引用这些接口。这样,您仍然可以在 API 上定义它们并根据需要使用它们,但它们不会妨碍您。而且您总是可以在需要的地方转换为模型对象。或者, 3. 在您的 DTO 上添加一个构造函数,该构造函数接受模型对象作为参数并让 DTO 包装模型对象。并在 DTO 中添加一个ToModelObject 函数,它可以让您轻松转换为模型对象。

    我确实认为您应该首先关注让基本控制器按预期工作,然后才添加 DTO。这样,您一次只关注一种并发症。

    【讨论】:

    • 首先感谢您的宝贵时间。在没有 DTO 的情况下它运行良好。但我的新项目需要它们。这真的让我很困惑。我会通过你的观点。再次感谢您
    猜你喜欢
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 2014-07-07
    • 2018-10-26
    • 2010-09-16
    • 2011-02-17
    • 1970-01-01
    相关资源
    最近更新 更多