【问题标题】:Setup multiple areas with controllers in each area inheriting from a base controller - MVC在从基本控制器继承的每个区域中使用控制器设置多个区域 - MVC
【发布时间】:2011-06-19 04:01:06
【问题描述】:

我目前正在处理一个半大型 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

我正在考虑为每个工作控制器创建区域,即

  • 区域/工作A
  • 区域/工作B

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

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

这种设置看起来是可以接受的区域使用吗?从我所阅读的内容来看,区域似乎有助于分离我正在寻找的关注点和功能。但是,如果这是对功能的完全错误使用,我不想投资这样做?

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

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-2


    【解决方案1】:

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

    要回答您的问题,将基本控制器的逻辑共享到其他区域的控制器中没有问题。如果这样做有意义的话。但是,如果您开始在继承链中深入多层,我会强烈考虑查看代码并查看共享逻辑在不同的共享类中是否有意义,而不是通过多个覆盖使事情复杂化。

    如果您要覆盖不同级别的行为,您可能需要研究策略模式。您可以使用该模式来交换组件的行为并使用组合,而不是继承。

    【讨论】:

    • 我承认这棵树很深。许多功能是附加方法,然后由继承的控制器根据需要使用,并且通常是受保护的方法。它们不是特别大,尤其是 BaseWorkAControllers 等。我不确定我们如何重构它,但我可能能够摆脱这个级别,所以我会看看建议的模式。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    • 2015-12-05
    • 2011-01-08
    • 1970-01-01
    • 2014-12-02
    • 2013-08-06
    • 1970-01-01
    相关资源
    最近更新 更多