我在哪里将这个逻辑放在这个简单的MVC场景中?

时间:2014-07-23 23:21:31

标签: oop model-view-controller mvvm viewmodel

我将描述我必须解决的问题,然后提出我的问题。

问题

我的问题非常简单,或者看起来如此。我需要访问数据库,并获取一系列体育交易实体。其中包括“Denver Nuggets交易PlayerX for PlayerY”等内容。一旦我有了一个交易实体的集合,我需要以特定的格式将内容输出到.txt文件,大致如下所示:

Title
  Sport1
    League1
      Transaction1
      Transaction2
      ...
    League2
      Transaction1
      Transaction2
  Sport2
  etc.

体育和联赛的顺序很重要。首先是棒球,然后是足球,等等。如果一项运动没有交易,那么这项运动的文件中不包含任何内容。这就是程序。

我正在使用ORM,并且Transaction实体非常大,有很多额外的字段,我不需要显示。出于这个原因,我想映射到只包含上述信息的viewmodel。

问题

首先,这里没有'域',因此不需要分解域的Transaction对象,对吧?我需要做的就是从数据库实体映射到ViewModel?

其次,我在存储库方法调用中编码了多少“视图”逻辑?我是否收回了交易实体的集合,然后在我的控制器中对它们进行排序?或者存储库是否应该为我进行此类排序?我觉得如果我让存储库类按照我对视图所需的顺序对事务进行排序,那就是传播视图逻辑,这是令人困惑的。另一方面,让数据库进行排序有一个性能优势。

第三,控制器在构建视图模型方面做了多少工作?例如,就像我上面所说的那样,任何没有交易的运动都不应该显示。控制器是否应该检查并明确地从视图模型中排除这些事务,或者视图是否应该进行检查和决策?

感谢您抽出宝贵时间作出回应。

2 个答案:

答案 0 :(得分:2)

  

首先,这里没有'域',所以不需要分解   域事务对象,对吗?我需要做的就是从a映射   数据库实体到ViewModel?

听起来不错

  

其次,我在存储库方法中编码了多少“视图”逻辑   呼叫?我是否收到交易实体的集合,然后   在我的控制器中排序?或者存储库是否应该进行此排序   为了我?我觉得如果我让存储库类对我的事务进行排序   按照我需要它们的顺序进行查看,那就是传播   查看逻辑,这是令人困惑的。另一方面,有一个   通过让数据库进行排序,性能得益。

我认为在数据库中排序是可以的,因为它对性能更好。多少“观点”?取决于观点。见下一个答案。

  

第三,控制器在构建方面做了多少工作   视图模型?例如,就像我上面所说的,没有任何运动   根本不应该显示交易。应该是控制器   从视图模型中检查并明确排除这些事务,   或者视图是否应该进行检查和决定?

您正在转储到文本,因此这里的“查看”只是您要添加到缩进的标签或空格的数量。但是,如果它是一个GUI树组件呢?然后,您必须将数据推送到节点中,并提供有关哪个节点是哪个节点的子节点的信息,然后您就可以为您的控制器工作。

我认为MVC的主要思想是更容易切换每个组件。我的意思是,如果要将典型的树形可视化从纯文本替换为GUI树组件,那么您的MVC设计得很好。如果不是,也许图层仍然过于耦合,您无法正确地重复使用其他图层。

答案 1 :(得分:1)

  

首先,没有'域名'在这里,所以不需要分解   域事务对象,对吗?我需要做的就是从a映射   数据库实体到ViewModel?

您的意思是数据传输对象(DTO)吗?如果您跨越边界,您仍然可能需要它们(即db>存储库> webservice>存储库>您的应用程序)。从webservice到您的应用程序,您跨越边界,因此您可能需要DTO来减少数据。

  

其次,多少'观看'逻辑我在存储库方法中编码   呼叫?我是否收到交易实体的集合,然后   在我的控制器中排序?或者存储库是否应该进行此排序   为了我?我觉得如果我让存储库类对我的事务进行排序   根据我需要它们的顺序来观察,然后那个传播   查看逻辑,这是令人困惑的。另一方面,有一个   通过让数据库进行排序,性能得益。

存储库应该用于获取数据。是否在存储库中使用sort取决于您想要做什么。

您是否只想通过" Sport"然后通过" League",然后通过ie"交易日期"?然后在存储库ihmo中完成它就没问题了。

您是否希望它将您的数据带入树形结构?那就不要。这应该封装在一个服务中。该服务接收您的存储库的实例,您可能在服务中有public PlayerTransactionsViewModel PlayerTransactionsService.GetAllTransactions()或类似的内容。然后,该服务查询所有事务数据并将其转换为ViewModel

  

第三,控制器在构建方面做了多少工作   视图模型?例如,就像我上面所说的,没有任何运动   根本不应该显示交易。应该是控制器   从视图模型中检查并明确排除这些事务,   或者视图是否应该进行检查和决定?

控制器动作应该非常小,主要是对视图的调用。您应该没有构造逻辑,除了分配一些值(即从Service映射到ViewModel ...除非您的服务已经返回ViewModel当然)。

这里可能希望使用数据传输对象,以减少从存储库获取并传递给服务的数据。

在回答第二个问题时,您应该使用服务从控制器封装逻辑并将控制器限制为简单调用

PlayerTransactionsViewModel viewModel = playerTransactionService.GetAllTransactions();
return View(viewModel);

但是既然你正在编写一个文本文件(我假设是文件系统),实际上根本没有涉及View,你也可以在服务中这样做