我会描述我要解决的问题,然后提出我的问题。
我的问题很简单,或者看起来很简单。我需要击中数据库,并得到一个集合的体育交易实体。其中包括"丹佛掘金用PlayerX交易PlayerY"。有了Transaction实体集合后,我需要以特定格式将内容输出到.txt文件,大致如下所示:
Title
Sport1
League1
Transaction1
Transaction2
...
League2
Transaction1
Transaction2
Sport2
etc.
运动和联赛的顺序很重要。首先是棒球,然后是足球,等等。如果一个运动没有事务,那么该运动的文件中就不包含任何内容。这就是整个程序。
我正在使用ORM, Transaction实体非常大,有很多我不需要显示的额外字段。出于这个原因,我想映射到一个只包含上述信息的视图模型。
首先,这里没有"域",所以不需要分解域事务对象,对吗?所有我需要做的是从数据库实体映射到ViewModel?
其次,我在存储库方法调用中编码了多少"视图"逻辑?我是否返回Transaction实体的集合,然后在我的控制器中对它们进行排序?或者存储库应该为我做这个排序吗?我觉得,如果让存储库类按照视图所需的顺序对事务进行排序,那么就会将视图逻辑传播开来,这会让人感到困惑。另一方面,让数据库进行排序可以提高性能。
第三,控制器在构造视图模型方面做了多少工作?例如,就像我上面说的,任何没有交易的运动都不应该被展示。控制器应该检查并明确地从视图模型中排除这些事务,还是视图应该进行检查并做出决定?
感谢您抽出时间回复。
首先,这里没有"域",因此不需要分解域事务对象,对吧?我只需要从a映射数据库实体到ViewModel?
听起来不错
其次,我在存储库方法中编码了多少"视图"逻辑电话吗?我是否得到一个Transaction实体的集合,然后呢在我的控制器中排序?或者存储库应该进行这种排序给我吗?我觉得如果让存储库类对事务进行排序根据我需要它们的顺序,这就是传播从逻辑上看,这是令人困惑的。另一方面,有一个让数据库进行排序可以提高性能。
我认为排序在DB是好的,因为它是更好的性能。有多少"视野"?这取决于你的观点。请看下一个答案。
第三,控制器在构造方面做了多少工作视图模型?例如,就像我上面说的,任何没有事务根本不应该显示。控制器是否应该检查并明确地从视图模型中排除这些事务;或者视图应该进行检查和决定?
你要转储到文本,所以这里的"view"就是你要添加缩进的制表符或空格的数量。但是如果它是一个GUI树组件呢?然后,您必须将数据推入节点并提供有关哪个节点是哪个节点的子节点的信息,然后您就可以为您的控制器工作了。
我认为MVC的主要思想是使每个组件的切换更容易。我的意思是,你的MVC设计得很好,如果将典型的树可视化从纯文本替换为GUI树组件很容易。如果不是,可能这些层仍然过于耦合,并且您不能正确地重用其他层。
首先,这里没有"域",因此不需要分解域事务对象,对吧?我只需要从a映射数据库实体到ViewModel?
你指的是数据传输对象(DTO)吗?如果你跨越了边界,你仍然可能需要它们(即db> repository> webservice> repository>你的app)。从web服务到你的应用,你跨越了边界,所以你可能需要dto来减少数据。
其次,我在存储库方法中编码了多少"视图"逻辑电话吗?我是否得到一个Transaction实体的集合,然后呢在我的控制器中排序?或者存储库应该进行这种排序给我吗?我觉得如果让存储库类对事务进行排序根据我需要它们的顺序,这就是传播从逻辑上看,这是令人困惑的。另一方面,有一个让数据库进行排序可以提高性能。
应该有用于获取数据的存储库。是否在Repository中使用sort取决于您想要做什么。
您是否希望仅按"Sport"排序,然后按"League"排序,然后按i.e排序?"交易日期"?那么在存储库中做就可以了。
你想把你的数据变成树状结构吗?然后没有。这应该封装在服务中。服务接收存储库的实例,您的服务中可能有public PlayerTransactionsViewModel PlayerTransactionsService.GetAllTransactions()
或类似的东西。然后服务查询所有事务数据并将其转换为ViewModel
第三,控制器在构造方面做了多少工作视图模型?例如,就像我上面说的,任何没有事务根本不应该显示。控制器是否应该检查并明确地从视图模型中排除这些事务;或者视图应该进行检查和决定?
控制器动作应该非常小,并且主要封装对视图的调用。你应该没有任何构造逻辑,除了分配一些值(即从Service映射到ViewModel…当然,除非你的服务已经返回了一个ViewModel)。
这里可能需要使用数据传输对象,以减少从存储库获取并传递给服务的数据。作为对第二个问题的回答,你应该使用一个服务来封装控制器的逻辑,并将控制器限制为简单的调用
PlayerTransactionsViewModel viewModel = playerTransactionService.GetAllTransactions();
return View(viewModel);
但是由于你写的是一个文本文件(我假设是文件系统),实际上根本不涉及视图,你也可以在服务中这样做