我有一个带有menu和menuItem的简单模型,它们都继承自抽象类。
我创建了一个可以进行CRUD操作的adminController。
我在这里遇到的是应该为menu和menuItem创建控制器吗? 因为menu和menuItem都是从同一类型继承的。 同时,他们对像Edit()
这样的方法的相同观点可以有不同的外观。
我的意思是我必须检查视图以了解我正在尝试编辑菜单或MenuItem
但如果我为每个实体实现控制器,我有重复的代码。 那么为这种操作设计控制器的最佳方法是什么?
答案 0 :(得分:2)
对于它的价值,控制器只是类,这意味着它们可以继承自己。所以,您可以这样做:
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。
答案 1 :(得分:0)
不幸的是,答案是“它取决于”。
您可以根据对象类型从同一菜单控制器调度到不同的视图,使用控制器上的常见操作,视图调用具有类型区分属性的相同HttpPost操作。这是一种将OO架构暴露给公共API表面的设计。
或者,由于这些是独立的域实体,您可以使用自己的CRUD操作套件公开两个控制器,并且具有更多类似于API的REST表面。
重复代码以提供独立的端点或安全策略区分对公共API表面的影响比其他地方更少气味。