什么是ASP.NET MVC中基本控制器类的优秀候选者?

ken*_*ner 27 asp.net-mvc controller base-class

我见过很多人谈论在他们的ASP.NET MVC项目中使用基本控制器.我见过的典型例子就是记录或者CRUD脚手架.基本控制器类有哪些其他好的用途?

Joh*_*ell 41

基本控制器类没有很好的用途.

现在听我说

Asp.Net MVC,特别是MVC 3有大量的可扩展性钩子,它们为所有控制器添加功能提供了更加分离的方式.由于您的控制器类非常重要且对应用程序至关重要,因此保持它们的轻量级,敏捷性以及与其他所有内容松散耦合非常重要.

  • 日志记录基础结构属于构造函数,应通过DI框架注入.

  • CRUD脚手架应由代码生成或自定义ModelMetadata提供程序处理.

  • 全局异常处理应由自定义ActionInvoker处理.

  • 全局视图数据和授权应由操作过滤器处理.使用MVC3中的全局动作过滤器更容易.

  • 常量可以放在另一个名为ApplicationConstants的类/文件中.

基本控制器通常由没有经验的MVC开发人员使用,他们不知道MVC的所有不同的可扩展性部分.现在不要误解我的意思,我不会因为所有错误的原因而与使用它们的人一起评判和合作.它的经验为您提供了解决常见问题的更多工具.

我几乎肯定没有一个问题你用另一个扩展性钩子而不是基本控制器类来解决.除非存在显着的生产力原因并且您没有违反Liskov,否则不要采用最严格的耦合形式(继承).我宁愿花费<1秒在我的控制器上输入20次属性,而public ILogger Logger { get; set; }不是引入紧密耦合,这会以更重要的方式影响应用程序.

甚至类似userId或多租户密钥的东西也可以放在ControllerFactory而不是基本控制器中.基本控制器类的耦合成本是不值得的.

  • 我不相信.您希望在所有控制器中使用相同的代码而不是基本控制器,因此必须有一个优势.你说优势是"松散耦合",但这究竟是什么意思,它解决了哪些问题,除了解耦之外它做了什么呢? (37认同)
  • @Tassadaque - 耦合,耦合,耦合和耦合. (8认同)
  • 我不确定我是否同意这里,但这里有很多值得思考的东西,所以+1.我倾向于认为基本控制器可以与动作过滤器等​​结合使用.如果子类想要覆盖所述方法,则没有什么能阻止它. (3认同)
  • 我不明白这里提出的论点.当然,不必要的耦合是可以避免的,但与其他所有东西一样,它是一种取决于当前情况的选择,并且会有一个好处大于成本的场景.继承可以为您提供低成本的单点通用逻辑,并减少代码和表面区域的人为错误,_s_这种概括实际上是有道理的.我认为没有人会争论你应该尝试使用_everything的基类_你可以用属性做什么. (3认同)
  • 好的,我们可以在不使用基本控制器的情 您能告诉我们使用基本控制器的一些缺点吗? (2认同)
  • 有更好的方法来组成该行为而不是作为基类.您可能想要谷歌"组合与继承"以获得关于该主题的更好的入门,而不是SO评论允许的. (2认同)

小智 8

我喜欢使用基本控制器进行授权.

我没有使用"授权"属性来装饰每个动作,而是在基本控制器中进行授权.从数据库中为登录用户提取授权操作列表.

有关授权的更多信息,请阅读以下链接. 在自定义控制器工厂中进行通用授权的良好做法?