2011-06-19 29 views
0

我目前正在研究一个半大型MVC 2项目,我们拥有的关联视图和视图模型的控制器数量正在变得非常大。为了尝试并提供一些分离,我一直在研究使用MVC 2的区域特征并相应地重构项目。在控制器的每个区域设置多个区域,继承自一个基础控制器 - MVC

我面对的问题之一是我们对控制器有一个继承层次,以便共享我们在具体控制器中使用的功能和属性,然后公开我们希望处理的必要操作。

本质上讲,我们现在有一个设置像这样在我们的主控制器文件夹:

Controller (MVC) 
+-- BaseController (Abstract) 
     +-- BaseWorkController (Abstract) 
      +-- BaseWorkAController (Abstract) 
       +-- ... a number of controllers exposing actions 
      +-- BaseWorkBControllers (Abstract) 
       +-- ... a number of controllers exposing actions 

我每个工作控制器思维创造地区即

  • 区/ WorkA
  • 区/ WorkB

每个区域都有其关联的视图和视图模型甚至模型。

但是,我似乎面临的问题是我在哪里放置BaseWorkController。可以将它保留在主控制器文件夹中,并且区域控制器只包含对该控制器的引用。另外,不同区域的代码可能需要访问不同的模型,甚至需要为某些功能创建一些属性。

这个设置看起来像是可以接受的区域使用。从我读过的东西看来,这些东西似乎有助于我正在寻找的关注点和功能。但是,如果这是对功能的完全错误使用,我不想投资这么做。

控制器代码是否可以使用来自其他区域或主要核心控制器/模型/视图文件夹的功能。

回答

2

您的应用程序中的继承数量对我来说是一个警告。如果你有那么多的共享行为,我认为你应该考虑把它从控制器本身中拉出来,并创建一些封装共享逻辑的类,然后你可以通过组合来扩展控制器的功能,而不是继承。

要回答您的问题,从基础控制器到其他区域的控制器共享逻辑没有任何问题。如果这样做是有道理的。但是如果你开始在继承链中深入几层,我会强烈考虑检查代码,看看共享逻辑是否可以在不同的共享类中有意义,而不是用多重覆盖来使事情复杂化。

如果您重写不同级别的行为,您可能需要查看策略模式。您可以使用该模式交换组件的行为并使用组合,而不是继承。

+0

我承认树很深。许多功能是继承控制器根据需要使用的附加方法,通常是受保护的方法。他们不是特别大,特别是BaseWorkAControllers等我不确定我们如何重构这个,但我可能能够摆脱这个水平,所以我会看看建议的模式。谢谢。 – dreza