在ASP.NET MVC中,ActionResult
该类是操作方法从控制器返回的所有结果的基础,它被定义为具有单个方法的抽象类(©Microsoft):
public abstract void ExecuteResult(ControllerContext context);
你能想到这个设计的具体原因吗?具体来说,这对我来说似乎有点奇怪
没有IActionResult
界面,
并且如果有这样的接口,则根本不需要该类.
毕竟,如果这是一个接口而不是那个抽象类,那么就不需要扩展基类来创建一个新的ActionResult
- 只需要IActionResult
正确实现.在一个世界上,错误的语言,没有多重继承,这个优势对我来说似乎非常重要.
接口非常适合允许类实现多个契约,例如当您知道类型必须是两个不同的东西时.在某些情况下,这可能会鼓励创建一个责任太多的类型.
行动结果只有一个责任,似乎没有任何场景需要一个对象同时成为一个动作结果和其他东西.即使你这样做,也可以通过作曲来完成.因此,在这种情况下,我们选择ABS以便在RTM进行必要的更改后允许我们更大的灵活性.
但是,如果有一个特定的场景我们阻止接口更好,我们会考虑它.我们总是可以在以后不以破坏的方式做到这一点.
您甚至可以通过编写自己的动作调用程序来完成它,这只需要您实现IActionInvoker(一个接口),并且调用者可以检查您自己的IActionResult而不是ActionResult.