BaseController用于MVC中的什么?

时间:2015-03-07 20:29:39

标签: asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

我看了一下关于MVC的更多教程。但我不明白,人们正在使用“BaseController”做什么?在一个项目中,有人将其用于所有控制器之间的通信。在其他项目中,有人用于获取日志。你能完全向我解释一下吗?

2 个答案:

答案 0 :(得分:1)

这不是在应用程序中使用basecontroller的必要条件,但它与您在应用程序中的所有页面使用母版页一样,您可以在此处保持页面的常用功能。从每个控制器调用操作方法时,您需要不同的常用功能,如

  1. 异常处理
  2. 母版页面级别设置
  3. 常用自定义授权。
  4. 常见的自定义缓存
  5. 母版页级别的通用模型
  6. 所以每次如果你调用不同的控制器及其动作,你需要重新生成它,你可以通过basecontroller重建或处理它。

    希望这有助于解决您的问题。

答案 1 :(得分:1)

对于一些开发人员来说,创建一个“BaseController”或者实际上是一个BaseAnything类用于常见功能,然后从该BaseWhatever派生其他东西以便重用该功能是一种非常常见的做法。这只是基本的面向对象编程技术,与MVC没有任何关系(除了我们在这个例子中专门讨论BaseController的事实)。

有一些,我碰巧在其中,他们认为明确的基类通常是代码气味,并且经常被严重滥用为“捕获所有”。为了方便起见,人们常常将各种东西放在这些基类中,因为它比创建一些其他机制以更好的方式共享代码或数据更容易。

除非绝对必要,否则我会避免使用Base类。我倾向于选择其他方法来实现通常以这种方式实现的功能(我称之为懒惰重用)。替代方案的例子是:

  • 扩展方法
  • Html.Action methods
  • 属性框架,例如AOP
  • 依赖注入
  • 还有更多..

您可以创建一个具有最佳意图的基类,并声称它只会用于非常有限的功能......但在您知道它之前,正在您项目中开发的其他人填充各种内容那里。

我的规则是,不要这样做。避免不惜一切代价创建基类,除非没有其他好方法可以做到。

*注意:我指的是用于共享实现/数据的唯一目的的具体基类。通用和抽象基类是一个不同的故事,用于分类法的基类(即关系)和分层目的。一般来说,如果你调用了FooBase或BaseFoo,它可能属于这种类型。

此规则还有其他例外,例如在为测试目的包装untestable类时,通常会为此目的创建一个基类,或者在框架中有时会故意构建一个旨在继承的基类,但不是通用的或抽象的。它可以提供适合框架的功能。但是,在使用这些框架时,这些并不是您经常可以控制的。