我应该如何封装我的 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 从不同的视图调用它呢?
我有两个 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 从不同的视图调用它呢?