我目前正在开发一个半大型MVC 2项目,我们拥有相关视图和视图模型的控制器数量正在变得非常大。为了尝试提供一些分离,我一直在研究使用MVC 2的区域功能并相应地重构项目。
我面临的一个问题是我们的控制器有一个继承层次结构,以便共享我们在具体控制器中使用的功能和属性,然后公开我们希望处理的必要操作。
基本上我们目前在主控制器文件夹中有这样的设置:
Controller (MVC)
+-- BaseController (Abstract)
+-- BaseWorkController (Abstract)
+-- BaseWorkAController (Abstract)
+-- ... a number of controllers exposing actions
+-- BaseWorkBControllers (Abstract)
+-- ... a number of controllers exposing actions
我正在考虑为每个工作控制器创建区域,即
每个区域都有相关的视图和视图模型甚至模型。
然而,我似乎面临的问题是我在哪里放置BaseWorkController。是否可以将其保留在主Controllers文件夹中,区域控制器只包含对该控制器的引用。此外,不同区域的代码可能需要访问不同的模型,甚至是我们为某些功能创建的一些属性。
此设置是否可以接受区域使用。从我所阅读的内容来看,似乎有助于分离我正在寻找的问题和功能。但是,如果完全错误地使用该功能,我不想投资这样做吗?
控制器代码是否可以使用来自其他区域或主要核心控制器/模型/视图文件夹的功能。
答案 0 :(得分:2)
您应用程序中的继承量对我来说是一个警告。如果你有这么多的共享行为,我认为你应该考虑将它从控制器本身中拉出来并创建一些封装共享逻辑的类,然后你可以通过组合扩展控制器的功能,而不是继承。
要回答您的问题,将基础控制器的逻辑共享到其他区域的控制器没有问题。如果这样做是有意义的。但是如果你开始在你的继承链中深入了解几层,我会强烈考虑查看代码并查看共享逻辑是否在不同的共享类中有意义,而不是使用多个覆盖复杂化。
如果要覆盖不同级别的行为,您可能需要查看策略模式。您可以使用该模式来交换组件的行为并使用组合,而不是继承。