我正在开发一个MVC.NET项目。我对这项技术有一些疑问。
我有一些控制器之间通用的功能(或动作)。在控制器之间共享功能的方法之一是创建BaseController
并从Controller
扩展此控制器并从BaseController
扩展另一个控制器,但它存在一些问题。困扰我的一个问题是用户可以请求此URL www.MySite.com/BaseController
(我是对的吗?)如果我使用Authorize属性,我的所有操作都需要授权。在不同的控制器中使用共享功能的另一种方法是什么。我需要使用这些共享函数ViewBag
。你能救我吗?
答案 0 :(得分:1)
我建议你采用不同的方法。
首先,我不是传承的忠实粉丝。通常人们会误解这个概念并使用它来避免代码复制。继承的目的实际上是能够以独特的方式处理具有共同祖先的不同类的对象并利用多态性。我的情况我认为我宁愿选择composition。我将在您的控制器和模型之间引入另一层。该层将被称为业务逻辑,将涵盖所有复杂的数据处理和决策。通过组合,我只需要控制器中业务逻辑层的类实例,并将特定的作业委托给它们。这样,控制器只是封装在业务逻辑层中的实际业务操作的入口点。
要考虑的另一件事是为共享的操作创建单独的控制器。如果它们是共享的,那么它们可能与它们的控制器没有关系并且有点违反了separation of concerns rule?
您可以做的另一件事是定义自定义路线。这样你就可以像上面描述的那样用共享函数提取控制器,并且仍然为用户提供优雅的URL。像这样:
public static void RegisterRoutes(RouteCollection routes)
{
...
routes.MapRoute(
name: "Route1",
url: "Controller1/Action1",
defaults: new { controller = "CommonController", action = "CommonAction"}
);
routes.MapRoute(
name: "Route2",
url: "Controller2/Action1",
defaults: new { controller = "CommonController", action = "CommonAction"}
);
}