如何解决什么是ASP.NET MVC中基本控制器类的良好候选者?
| 我已经看到很多人谈论在其ASP.NET MVC项目中使用基本控制器。我见过的典型示例是为日志记录或CRUD脚手架做的。基本控制器类还有哪些其他好的用法?解决方法
基本控制器类没有很好的用途。
现在听我说。
Asp.Net MVC,尤其是MVC 3具有大量的可扩展性钩子,它们提供了一种更加分离的方式来向所有控制器添加功能。由于您的控制器类非常重要,并且对于应用程序至关重要,因此使它们保持轻量,敏捷和与其他所有事物的松散耦合非常重要。
日志记录基础架构属于
构造函数,应该注入
通过DI框架。
CRUD脚手架应由
代码生成或自定义
ModelMetadata提供程序。
全局异常处理应为
由自定义ActionInvoker处理。
全局视图数据和授权
应该由动作过滤器处理。
使用全局动作过滤器更加轻松
在MVC3中。
常量可以放入另一个名为ApplicationConstants的类/文件中。
基本控制器通常由经验不足的MVC开发人员使用,他们不了解MVC的所有不同可扩展性。现在不要误会我的意思,我不是在判断和与出于所有错误原因使用它们的人一起工作。它的公正经验为您提供了更多解决常见问题的工具。
我几乎肯定,除了基本控制器类之外,没有其他扩展钩子无法解决的一个问题。除非存在明显的生产力原因并且您不违反Liskov,否则不要采取最紧密的耦合形式(继承)。我宁愿花<1秒的时间在我的控制器上键入20次类似“ 0”的属性,而不是引入紧密耦合,这将以更重要的方式影响应用程序。
甚至诸如userId或多租户密钥之类的东西也可以进入ControllerFactory而不是基本控制器。基本控制器类的耦合成本实在不值得。
,我喜欢使用基本控制器进行授权。
我没有使用\“ Authorize \”属性来修饰每个动作,而是在基本控制器中进行授权。从登录用户的数据库中获取授权操作列表。
请阅读以下链接以获取有关授权的更多信息。
在自定义控制器工厂中进行通用授权的良好实践?
,我用它来访问会话,应用程序数据等。
我也有一个应用程序对象,其中包含诸如应用程序名称等之类的东西,我可以从基类访问它
本质上,我将它用于重复很多的事情
哦,我应该提一下,我不会将其用于业务逻辑或数据库访问。我猜常量对于基类也是一个很好的选择。
,我在许多项目中都使用了基本控制器,并且表现出色。我主要用于
异常记录
通知(成功,错误,添加..)
调用HTTP404错误处理
,根据我的经验,理想情况下,您希望放入基本控制器中的大多数逻辑都将放入动作过滤器。动作过滤器只能使用常量进行初始化,因此在某些情况下您不能这样做。在某些情况下,您需要将操作应用于系统中的每个操作方法,在这种情况下,将逻辑放在基础中可能更有意义,而不是使用新的actionFilter属性为每个操作方法添加注释。
我还发现将引用服务的属性(否则会与控制器分离)放入基础中很有帮助,使它们易于访问和一致地初始化。
,我们将BaseController用于两件事:
应该应用于所有控制器的属性。
重定向的替代,它通过检查重定向URL是本地URL来防止公开重定向攻击。这样,所有调用重定向的控制器都将受到保护。
,我所做的是使用通用控制器基类来处理:
我创建了
BaseCRUDController<Key,Model>
,它需要一个ICRUDService<TModel>
对象作为构造函数参数,因此基类将处理Create / Edit / Delete。并确保在虚拟模式下可以在自定义情况下处理
ICRUDService<TModel>
具有诸如Save / Update / Delete / Find / ResetChache / ...之类的方法,我为我创建的每个存储库实现了它,因此我可以为其添加更多功能。
使用这种结构,我可以添加一些常规功能,例如PagedList / AutoComplete / ResetCache / IncOrder&DecOrder(如果模型是IOrderable)
错误/通知消息处理:布局中带有@TempData[\"MHError\"]
代码的部分,以及基本控制器中的属性,例如
公共通知错误
{
设置{TempData [\“ MHError \”] =值; }
获取{返回(通知)TempData.Peek(\“ MHError \”); }
}
使用这个Abstract类,我可以轻松地处理每次必须编写或使用Code Generator创建的方法。
但是这种方法也有缺点。
,我现在正在使用基本控制器通过i18N库进行国际化。它提供了一种我可以用来在控制器中本地化任何字符串的方法。
,过滤器不是线程安全的,数据库访问和依赖注入的条件,使用它时其他线程可能会关闭数据库连接。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。