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

时间:2015-10-16 08:00:14

标签: c# asp.net-mvc inheritance encapsulation code-duplication

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

Existing Controller class hierarchy

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

Final Controller class hierarchy

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

3 个答案:

答案 0 :(得分:0)

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

听起来你已经在做这个了 ....但由于某些原因它不好,你能解释一下为什么这不适合你......

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

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

或者你只是试图更好地组织它......

如果是这种情况,那么只需将所有返回操作类型移动到另一个类中,让你的BaseController从中继承,我想你已经说过了,如果你那么肯定是好的。

答案 1 :(得分:0)

这取决于重复代码的功能。您可以使用继承或组合(带注入类)中的任何内容来重用不同控制器中的代码。

例如:我们有一个用于计算产品价格的Calculation类,并使用Dependancy Injection将此逻辑注入不同的控制器。然后控制器使用此计算器显示输出。

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

答案 2 :(得分:0)

不是创建另一个基本控制器,而是将两个动作中的代码提取到另一个类中,例如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();
}

如果您有UnitTests,那么您应该从JsonActionHelper中提取接口并将其注入您的控制器。

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

相关问题