我有两个类 - 在这种特殊情况下的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
有没有更好的方法来解决这个问题?
答案 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从不同的视图调用它?