我有一个带有 menu 和 menuItem 的简单模型,它们都继承自抽象类。
我创建了一个可以执行 CRUD 操作的 adminController。
我在这里坚持的是应该为菜单和菜单项创建控制器吗?因为 menu 和 menuItem 都继承自同一个类型。同时他们对类似方法的对应视图Edit()
可以有不同的外观。我的意思是我必须检查视图才能知道我正在尝试编辑菜单或 MenuItem
但是如果我为每个实体实现控制器,我就有重复的代码。那么为这种操作设计控制器的最佳方法是什么?
我有一个带有 menu 和 menuItem 的简单模型,它们都继承自抽象类。
我创建了一个可以执行 CRUD 操作的 adminController。
我在这里坚持的是应该为菜单和菜单项创建控制器吗?因为 menu 和 menuItem 都继承自同一个类型。同时他们对类似方法的对应视图Edit()
可以有不同的外观。我的意思是我必须检查视图才能知道我正在尝试编辑菜单或 MenuItem
但是如果我为每个实体实现控制器,我就有重复的代码。那么为这种操作设计控制器的最佳方法是什么?
对于它的价值,控制器只是类,这意味着它们可以被继承。因此,您可以简单地执行以下操作:
public class MenuController : Controller
{
// all the actions here
}
public class MenuItemController : MenuController
{
}
然后,根据命名约定,您可以将不同的视图应用于每个控制器的操作,只需将它们放在各自的视图目录中:分别为“Menu”和“MenuItem”。
如果您需要更改子类控制器中的特定操作方法,只需将操作设为虚拟,MenuController
然后在中覆盖它MenuItemController
:
public class MenuController : Controller
{
public virtual ActionResult SomeActionToOverride() { ... }
}
public class MenuItemController : MenuController
{
public override ActionResult SomeActionToOverride() { ... }
}
这只是基本的 OOP。
不幸的是,答案是“视情况而定”。
您可以根据对象类型从同一个 Menu 控制器分派到不同的视图,使用控制器上的公共操作,视图调用具有类型区分属性的相同 HttpPost 操作。这是一种将 OO 架构暴露给公共 API 表面的设计。
或者,由于它们是独立的域实体,您可以使用它们自己的 CRUD 操作套件公开两个控制器,并拥有更像 REST 的 API 表面。
在公共 API 表面上提供独立端点或安全策略差异的重复代码比其他地方的气味少。