【发布时间】:2015-03-07 20:29:39
【问题描述】:
我看更多关于 MVC 的教程。但我不明白,人们使用“BaseController”是为了什么?在一个项目中,有人将它用于所有控制器之间的通信。在其他项目中,有人用于获取日志。你能完整地给我解释一下吗?
【问题讨论】:
-
它可用于所有继承控制器共享的任何功能...
标签: asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4
我看更多关于 MVC 的教程。但我不明白,人们使用“BaseController”是为了什么?在一个项目中,有人将它用于所有控制器之间的通信。在其他项目中,有人用于获取日志。你能完整地给我解释一下吗?
【问题讨论】:
标签: asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4
在应用程序中使用 basecontroller 不是强制性的,但就像您在应用程序中为所有页面使用母版页一样,您可以在此处保持您的页面的通用功能相同。从每个控制器调用操作方法时,您需要不同的通用功能,例如
所以每次如果你调用不同的控制器及其动作,你需要重新生成相同的,你可以通过 basecontroller 重建或处理。
希望这将有助于解决您的问题。
【讨论】:
对于一些开发人员来说,创建一个“BaseController”或实际上是一个 BaseAnything 类以用于通用功能是一种非常常见的做法,然后从该 BaseWhatever 派生其他东西以重用该功能。这只是基本的面向对象编程技术,与 MVC 没有任何特定关系(除了我们在此实例中专门讨论 BaseController 的事实)。
有一些人(我恰好是其中之一)认为显式基类通常是一种代码异味,并且经常被严重滥用为“包罗万象”。很多时候,人们为了方便而将各种东西放在这些基类中,因为它比创建其他机制更容易以更好的方式共享代码或数据。
除非绝对必要,否则我会避免使用基类。我倾向于使用其他方法来实现通常以这种方式实现的功能(我称之为惰性重用)。替代品的例子有:
您可能会怀着最好的意图创建一个基类,并声称它只会用于非常有限的功能......但是在您知道之前,在您的项目中开发的其他人正在将各种东西塞进在那里。
我的规则是,不要这样做。不惜一切代价避免创建基类,除非确实没有其他好的方法。
*注意:我指的是仅用于共享实现/数据的具体基类。通用和抽象基类有点不同,用于分类(即 is-a 关系)和分层目的的基类也是如此。一般来说,如果你调用了 FooBase 或 BaseFoo,它可能就是这种类型。
此规则还有其他例外情况,例如在包装不可测试的类以进行测试时,您通常会为此目的创建一个基类,或者在框架中您有时会故意构建一个旨在被继承的基类,但不是通用或抽象的。它可以提供适合框架的功能。但是,在使用这些框架时,您通常无法控制这些事情。
【讨论】: