C# 我应该如何封装我的MVC操作以避免代码重复?

C# 我应该如何封装我的MVC操作以避免代码重复?,c#,asp.net-mvc,inheritance,encapsulation,code-duplication,C#,Asp.net Mvc,Inheritance,Encapsulation,Code Duplication,我有两个类——在这个特殊情况下是MVC控件——它们有一个通用的控制器操作(一个将从JavaScript调用的JSON操作)。由于代码重复,我希望将此操作放在父控制器类中。我们已经有了一个控制器基类,它继承自控制器,并用作基类,具有其他6个控制器的通用功能。我的JSON操作实际上只在2个控制器中常见,因此我认为将我的JSON操作放在其他6个控制器已经使用的基本控制器中不是一个好主意。下面是现有的类层次结构图: 为了避免代码重复,我应该将JSON操作放在哪里?我的想法是继承类ControllerB

我有两个类——在这个特殊情况下是MVC控件——它们有一个通用的控制器操作(一个将从JavaScript调用的JSON操作)。由于代码重复,我希望将此操作放在父控制器类中。我们已经有了一个控制器基类,它继承自控制器,并用作基类,具有其他6个控制器的通用功能。我的JSON操作实际上只在2个控制器中常见,因此我认为将我的JSON操作放在其他6个控制器已经使用的基本控制器中不是一个好主意。下面是现有的类层次结构图:

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


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

将所有控制器更改为继承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从中继承,我认为您已经说过了,如果您是,那么这很好。

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

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


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

不要创建另一个基本控制器,而是将两个操作的代码提取到另一个类中,例如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从不同的视图调用它呢?

我只是想更好地组织我的源代码,并了解其他人是如何解决这个问题的。不知何故,我不想继承自定义基本控制器,但我不知道如何用另一种方法解决这个问题。我想我会尝试使用这个组合解决方案,而不是继承。这两个控件的操作相同,但操作的结果来自服务对象。此服务对象是特定于控制器的。因此,我认为问题现在转移到了服务/存储库层。