部分控制器类的替代方案

时间:2013-04-04 16:00:20

标签: asp.net-mvc asp.net-mvc-3 single-responsibility-principle

我已经转移到一个具有public partial class AdminController的项目,还有15个其他类来实现这个分部类。我认为这样做是为了让项目可以通过"/admin/{methodname}"路径访问许多路径。

主要的部分类处理所有15个类的构造函数,因此有13个构造函数依赖项。

我认为这不是很漂亮,但我不确定如何整理它,所以每个类都可以拥有它所需的依赖关系,但保持所有路由都转到"/admin/{methodname}"

2 个答案:

答案 0 :(得分:2)

考虑将/admin转换为MVC Area,让不同的控制器处理该区域内的不同路径。

答案 1 :(得分:0)

我想说,将逻辑重构为较小的控制器,从而整理出太多的依赖问题,并通过使用自己的路由映射来处理路由问题。

你可以有一个RouteDefinition类,它包含一个元组(之前我说Hash,但我认为你需要超过2个参数)

public static class RouteDefinitions
{
    const List<Tuple<string,string,string> AdminRoutes = new List<Tuple<string,string,string>> {
        Tuple.Create("fooroute", //route
                     "foocontroller", //corresponding controller
                     "fooaction"), //corresponding action
        Tuple.Create("barroute", "barcontroller","baraction")
    };

    public static void AddRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        foreach(var adminRoute in AdminRoutes)
            routes.MapRoute(adminRoute.Item1, string.Format("Admin/{0}", adminRoute.Item1) , new { controller = adminRoute.Item2, action = adminRoute.Item3 });
    }
}

然后在Application_Start()中将其称为

RouteDefinitions.AddRoutes(RouteTable.Routes);