【问题标题】:Interface between Controller and Service Layer控制器和服务层之间的接口
【发布时间】:2014-07-07 11:52:41
【问题描述】:

我是 .Net MVC 的新手,我今天的问题是关于 MVC 模式。

在我们的应用程序中,我们有一个与数据库对话的服务层。

控制器当前正在与服务层对话以从数据库中获取值。

我们的新管理器需要模型而不是控制器的这种服务层交互。

他确实说这个架构是为了实现一个瘦的Controller。我们现在开始将服务层交互从控制器移植到模型。

我的问题来了。除了拥有一个瘦控制器之外,执行此模式还有其他好处吗?

我想知道这两种模式的优缺点。

一些链接也会有帮助

【问题讨论】:

  • 澄清一下,他是在要求您在“视图”模型中强制执行服务调用?
  • 瘦控制器是个好主意;从您的控制器调用服务并且其中几乎没有其他逻辑。你不想从你的模型中调用服务。
  • @ChirsBint。是需要从模型进行服务调用的 MVC 模式吗?或者它只是使用模型或控制器进行服务调用的一个选项。您能否详细说明您的评论。
  • 真的有4样东西;你的Controllers、你的Views、你的Model和你的ViewModels。您的Model 是您Controllers 背后的一切(服务、助手、存储库、数据库)。您的ViewModels 是您从Controllers 传递到Views 并返回的内容。从某种意义上说,您的服务本质上就是您的Model。从您的Controllers 呼叫服务。
  • @Shanky,永远不要从 ViewModel 调用服务!

标签: c# asp.net-mvc asp.net-mvc-3 model-view-controller service-layer


【解决方案1】:

为什么不应该从 ViewModel 调用服务:

ViewModel 应该是包含一些在 View 和 Controller 之间交换的数据的类。他们不应执行任何操作或检索更多数据。它们是愚蠢的模型,除了传输数据,它们什么都不做。

What is a View Model

如果您无法理解视图模型是什么以及不是什么,请将其视为您的模型的一个子集。它仅包含您需要在给定时间在给定视图上显示的数据。

【讨论】:

    【解决方案2】:

    模型有 3 种类型 - 视图模型、领域模型和数据模型。 Check here.

    如果您在谈论视图模型,那么这是一个坏主意。有一些方法可以实现瘦控制器,但ViewModel 永远不应该与服务交互。如果可能的话,Controller Action 应该只调用一个服务并将结果扔给 View。像这样:

    [HttpGet]
    public ActionResult GetAnimals(int id) 
    {
        var viewModel = new AnimalsService(id).GetViewModel();
        return View(viewModel);
    }
    

    但实际上,由于某些明显的原因,很多时候您无法做到这一点。不过,您可以做的事情很少。就像不在控制器中验证模型一样,您可以在 service layer 中执行此操作。不要犹豫,为不同的工作创建更多服务,例如分页、上下文相关逻辑或某些第三方 api 调用。为重复代码创建帮助程序或实用程序类。我也觉得写胖服务没问题。

    【讨论】:

    • 服务模型也经常在域模型上运行,这意味着您至少需要将域模型映射到控制器中的视图模型。我试图将映射转移到服务中,但经过一番思考后,我意识到这是个坏主意,因为服务用自己的语言(域模型)说话,因此不应该使用 VM。要解决您的问题,您可以创建外观,作为控制器之前的附加层,如果有人在 2019 年仍然存在此问题 :) 这值得付出努力吗?如果控制器很大,我认为是的。
    猜你喜欢
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多