我应该如何封装我的 MVC-Action 以避免代码重复?

How should I encapsulate my MVC-Action in order to avoid code duplication?

我有两个 classes - 在这种特殊情况下的 MVC 控制器 - 具有一个公共控制器操作(一个 JSON 操作将从 JavaScript 调用)。由于代码重复,我想将此操作放在父控制器中 class。我们已经有一个控制器基础 class,它继承自 Controller 并用作基础 class,具有共同的功能,来自其他 6 个控制器。我的 JSON 动作实际上只对 2 个控制器通用,所以我认为将我的 JSON 动作放在已经被其他 6 个控制器使用的基本控制器中不是一个好主意。这是现有的 class 层次结构图:

Existing Controller class hierarchy

我应该把我的 JSON 操作放在哪里以避免代码重复? 我的想法是继承 class ControllerBase – 比如说 ControllerBaseExtended –并将我的 JSON 操作放在这里。所以现在,我的 2 个控制器可以继承自 ControllerBaseExtended 而不是 ControllerBase。这就是 class 层次结构最后的样子:

Final Controller class hierarchy

有没有更好的办法解决这个问题?

更改所有控制器以继承 BaseController 而不是 Controller。

听起来您已经在这样做了...但出于某种原因它不太好,您能否更好地解释一下为什么这对您不起作用...

public class [my]Controller : BaseController
{
    public ResualtAction [my]Action 
        return Base.Something();
    }
}

public class BaseController : Controller
{
    public CustomeReturnAction Something()
    {
        return new CustomeReturnAction();
    }
}

或者您只是想更好地组织它....

如果是这样,那么只需将所有 return 操作类型移动到另一个 class 并让您的 BaseController 继承它,我想您已经说过了,如果您是那么不错

这取决于重复代码的功能。您可以使用继承或组合(使用注入 class)中的任何东西在不同的控制器中重用代码。

例如:我们有一个用于计算产品价格的计算 class,并使用依赖注入将此逻辑注入到不同的控制器中。然后控制器使用这个计算器来显示输出。

也许可以研究 ASP.Net MVC 的依赖注入。我推荐Simple Injector。它很好地集成到 ASP.Net MVC 框架中。

与其创建另一个基本控制器,不如将两个操作的代码提取到另一个 class,例如JsonActionProcessor。然后您将需要调用该实现。

public class JsonActionHelper
{
    public JsonResult Something()
    {
        //do something common
        return new JsonResult();
    }
}

然后你可以从你的动作中调用它

public JsonResult Action1()
{
    return new JsonActionHelper().Something();
}

public JsonResult Action2()
{
    return new JsonActionHelper().Something();
}

如果你有单元测试,那么你应该从 JsonActionHelper 中提取接口并将其注入到你的控制器中。

但是,如果您有 2 个相同的操作,为什么不执行一个操作并通过 JavaScript 从不同的视图调用它呢?