Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc MVC-创建新控制器与创建新方法_Asp.net Mvc_Single Responsibility Principle - Fatal编程技术网

Asp.net mvc MVC-创建新控制器与创建新方法

Asp.net mvc MVC-创建新控制器与创建新方法,asp.net-mvc,single-responsibility-principle,Asp.net Mvc,Single Responsibility Principle,我有以下控制器类: SchoolController extends Controller: // Mainly for AJAX requests + searchSchoolDataAction() + searchGradeDataAction() + searchPeriodDataAction() // Entry point for a school website + schoolAction(shortName) // Pre-enrolment process users

我有以下控制器类:

SchoolController extends Controller:

// Mainly for AJAX requests
+ searchSchoolDataAction()
+ searchGradeDataAction()
+ searchPeriodDataAction()

// Entry point for a school website
+ schoolAction(shortName)

// Pre-enrolment process users from a certain school can perform
+ startPreEnrolmentAction(shortName)
+ preEnrolmentStudentAction(school)
+ preEnrolmentTutorAction(school)
等等


现在。这是一个众所周知的原则,我们应该保持控制器薄,模型厚。此外,控制员还应遵循单一责任原则。我的控制器的重量增加了很多。所以,这里有一个问题:关于MVC和OOP的最佳实践,我应该什么时候创建一个新的控制器,什么时候应该向控制器添加一个新方法?此外,控制器方法的一个好例子是什么,或者这是留给程序员的吗?(如果是后者,这听起来有点违反直觉,因为这是一个需要遵循的原则,但我不确定。)事先谢谢。

控制器应该只处理用户请求,并仅在需要显示网页时添加新方法。例如,您需要为单个表创建CRUD

您的控制器将是国家/地区。 控制器操作表示网页,如fetchAllAction、AddAction、UpdateAction、DeleteAction

如果您的项目是长期运行的,那么您应该在企业架构上构建您的模型。企业架构由四层组成。 i) 数据模型。 ii)领域逻辑模型。 iii)制图员。 iv)服务。
注意:服务层是控制器的唯一网关和公共面。

根据我的经验,在设计控制器方法和新控制器时,SRP非常重要

考虑一下,基本控制器方法应该只包含一些逻辑,比如从DB/service查询填充视图模型,并将viewmodel呈现到视图中

关于创建控制器的SRP应该在更广泛的意义上。根据我的经验,这是维护、可扩展性和用户体验考虑的结合


以CRM系统中的“会计”部分为例。您可能希望使用一个控制器来表示会计部门的所有方面,但也可以将其分为“发票”、“税务”、“工资单”等。使用多个控制器可以改善用户体验,因为他们将从URI了解您页面的实际操作。多个控制器允许您将大型控制器精简为多个特定控制器

“注意:服务层是控制器的唯一网关和公共面。”这意味着控制器不应该看到模型,而应该看到反过来与模型联系的服务。这是正确的吗?如果是这样的话,这非常好地解释了控制器方法应该做什么(即使这不是我要问的,但你刚刚解决了我的另一个疑问)。现在,至于剩下的答案。。。1个网页=1个方法。我什么时候添加一个新的控制器?1控制器=1类,或1控制器=某些类?在服务层中,所有数据模型对象、映射器对象和业务逻辑都是实例化的,简单地说,服务层可以与其他层通信,但控制器只能访问服务层。您的控制器应该是特定于域的。例如,如果您正在创建博客,则所有与博客相关的方法都将写入博客控制器中。注意:控制器应该是特定于域的,它有助于应用程序的可维护性。您应该学习“域驱动应用程序”1控制器=1类,或1控制器=某些类。两者都是对的,这取决于你的申请要求。我将把这标记为我接受的答案,正如你向DDD指出的,并就最佳实践给了我额外的建议。另外,考虑到DDD,我必须解决我的主要问题。谢谢。如果我理解正确,一个控制器应该回答一个基本URI<代码>发票控制器应只回答
/invoice
税务控制器
应只回答
/tax
。这实际上简化了在需要新控制器类时的思考过程。现在,假设我有一个项目管理系统,一个
project
类有许多
问题。因此,如果我想编辑
问题
s,我必须首先访问
项目
。我是为
项目
添加一个控制器还是为
问题
添加一个控制器,还是在一个控制器类中混合使用这两个控制器?(考虑URI是
/project//issues
)我会说,归根结底,它取决于在某些情况下如何设计站点结构。首先,如果只想使用一个控制器,您可以将/发票和/税务发送到一个控制器。比如说,对于您的示例项目管理系统,我可能会添加另一个控制器来解决这个问题。毕竟,在一个典型的项目管理系统中,问题是一个相当大的主题。用户还可以添加一个问题并将其分配给所需的项目。什么时候考虑添加一个新的控制器?例如,以下逻辑是否有效?“如果我必须在某个类上添加CRUD,那么它属于一个新的控制器”。或者我觉得这太复杂了?在我的OP中,我可以说每个搜索方法都属于一个单独的类,除了
searchSchoolDataAction
schoolAction
。PreEnrolment方法也可以属于一个新类,比如,
EnrolmentController
。尽管每种方法都可能采用不同的路线,但我对这一逻辑的思考是否正确?