Answers:
在“ SOLID”中,“ I”代表接口隔离。该原理的整体思想是将大型接口拆分为更小,更模块化的接口。在MVC中,服务通常具有控制器将依赖的接口。您不希望您的控制器了解该服务的具体实现。因此,拥有一两种方法的一堆服务是一件好事。
服务通常在大型应用程序中返回DTO,而在小型应用程序中直接返回域模型。DTO通常意味着更多的工作,但更好的关注点分离。典型的流程是:
映射可以手动完成,但是大多数开发人员更喜欢使用Automapper之类的自动映射框架,因为我们不喜欢编写管道代码,而且我们可能会很懒惰:-)
http://en.wikipedia.org/wiki/Interface_segregation_principle
https://github.com/AutoMapper/AutoMapper
关于使用DTO和域模型的stackoverflow的众多讨论之一:https : //stackoverflow.com/questions/2680071/dto-or-domain-model-object-in-the-view-layer
在MVC中,模型不仅仅是DTO或一组Managers / Services,它还代表了您的应用程序正在建模的概念。您可以将其视为整个域或业务逻辑,包括状态和行为。现在,我们知道控制器的用途变得更加清楚了。要做的只是将命令转换为模型,然后将结果转换回视图。通常以ViewModels的形式完成,虽然ViewModels不同,但通常与MVC中的Model混淆。
如果您没有定义明确的模型,那么您可能已经到了现在大多数逻辑都驻留在控制器本身中的地步。此时,为了开始减小控制器的大小,您可以开始将此逻辑拉回到管理器或服务对象中。这些服务通常会返回并在类似DTO / Entity的对象上运行。然后,控制器将成为这些服务和视图模型之间的映射层。有关映射的一些好技巧,请查看本文。朋友们不要让朋友使用AutoMapper。
至于您的问题,第一个在很大程度上取决于您的应用程序。您需要按照某种方式进行重构,一旦从控制器中删除了逻辑,这种重构就会更加明显。至于测试,在服务内部实例化模型没有问题,但是,如果您发现测试很困难,则可能只是一个信号,您需要将服务分解成更小的部分,每个部分都由一个职责负责。
我发现服务对于执行可能需要多个控制器执行的逻辑确实非常有用,或者仅仅是不够具体而不能成为控制器的一部分,除了它使我的控制器变得太大而难以阅读之外,这是事实。 。
当他说“模型(发生业务逻辑的地方)”时,我个人不同意“ aaa”,因为那就是您拥有控制器的全部原因,我认为模型需要是简单的数据抽象器,以便控制器可以执行所需的任务;再次,服务不应参与数据抽象任务...
只是说哟...