【问题标题】:Controller -> Service -> Repository: Does service map Entity to ViewModel?控制器 -> 服务 -> 存储库:服务是否将实体映射到 ViewModel?
【发布时间】:2023-04-01 03:33:01
【问题描述】:

我有 MVC 应用程序,“M”包括服务和存储库层。

但是,我对在哪里以及如何做几件事感到有些困惑。

  1. 一个服务调用两个存储库,或调用它自己的存储库和另一个服务

例如

我有一个 ReferenceDataService,它使用我的参考表处理 CRUD 的所有逻辑。

然后在我的“客户服务”中,我需要“R”我的参考数据以获取例如描述而不是 ID。那么,我应该调用 ReferenceDataService 还是 ReferenceDataRepository?

  1. 在某个层,我想从 Entity 映射到 ViewModel。

我是在我的服务层还是在控制器中执行此操作?

例如我的 ServiceLayer 是否执行从 VM 到实体并返回的映射/逻辑?

谢谢:)

【问题讨论】:

    标签: asp.net-mvc-3 service repository-pattern


    【解决方案1】:
    • 存储库与底层数据源通信。
    • 服务层与具有域模型的存储库对话。它从/向存储库层获取/传递域模型。
    • 控制器与服务层对话。控制器从/向服务层获取/传递域模型。
    • 控制器调用映射层(如果有)在域模型和视图模型之间进行映射。如果您没有映射层,您可以在控制器中进行映射,尽管这很快就会变得很麻烦,在这种情况下,AutoMapper 可以作为一个非常方便的映射层。

    另一个更简单的场景是当您不需要服务层时,这在较小的应用程序中通常是这种情况。服务层不会带来任何好处。因此控制器直接与具有域模型的存储库对话。

    【讨论】:

    • Thx :) 我想我可能正在删除我的服务层......它在我的应用程序中几乎没有什么用途,我将它包括在内只是因为“它符合模式”。哇!
    【解决方案2】:

    ViewModel 包含在视图上显示模型所需的数据。如果您将使用其他视图(例如移动应用程序、桌面应用程序,甚至 Web 服务),您将需要在视图中显示其他数据。如果您将在服务层上进行映射,那么您将无法将其与其他类型的应用程序一起使用。因此,控制器是您映射域数据以在视图上显示它们的地方(无论您拥有什么类型的视图)。

    【讨论】:

    • 我认为像 Interactor/UseCase 这样的另一个层可以解决这个问题,但我之前已经在控制器中映射过。我会在您的回答中补充说,最好将映射函数抽象到单独的文件/实用程序以避免膨胀。我见过很多控制器/组件塞满了映射逻辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 2013-02-22
    • 2012-04-27
    相关资源
    最近更新 更多