我正在开发一款应用,我正在思考一些事情。所以我想我会在这里请有经验的人告诉我他们对此的看法。
所以我有这个控制器(存储控制器),它很庞大,有很多方法,Get和Post动作等等。它工作正常,但我还处于开发阶段。
我想知道最佳做法是什么:让这个控制器拥有如此多的方法和动作,或者将方法拆分为多个控制器?让一个控制器处理几乎所有方法或许多控制器是理想的吗?
在你问之前,是的,我的商店控制器中的所有东西都是“商店相关的”。但在我的商店里,我有物品,包裹等等。
修改
谢谢大家!根据你的建议,我将我的巨大Store
控制器分成了较小的控制器:一个用于物品,一个用于包装,依此类推。这确实使代码更具可读性。此外,提供的大量评论将使我进入升级的轨道,所以非常感谢!
答案 0 :(得分:6)
最好将所有控制器的操作划分为一些逻辑包 - 因此将它们移动到单独的控制器中。多亏了这一点,对于那些将参与项目工作的其他开发人员来说,这一切都变得更加可读和直观。
问题是:如何划分?
实际上有一些标准可以影响这样的决定:例如:
一种非常常见的方法是通过CRUD划分控制器,尽管它并不总是适用。 另一方面,你的控制器不应该过于颗粒化 - 所以你不应该夸大它。
请记住,ASP.NET MVC使用CoC(约定优于配置)方法,该方法也适用于控制器和视图命名约定以及它们被分组并放置在适当目录中的方式。划分控制器时,应考虑到这一点。
答案 1 :(得分:2)
我更喜欢多个控制器,而不是一个具有许多操作的控制器。我会这样做 - 让BaseStoreController派生自Controller,这个控制器我们将拥有共同的功能和属性。然后让StorePackageController,StoreItemsController等从BaseStoreController派生。
在每个控制器内部,我将有与包,项目等相关的相应动作。在每个动作中,我将确保使用Command Pattern和Facade模式来确保正确的代码分离。
答案 2 :(得分:2)
我接近它的标准方法是每个菜单选项有一个控制器
例如,假设您有一个包含菜单选项的网站
主页,产品,博客,常见问题等
我会有一个HomeController,ProductContsController,BlogController和FAQController
您还可以创建一个或两个通用控制器来处理网站的多个部分和基本控制器使用的共享操作,而不是处理跟踪和记录页面访问等常规任务。
要注意的另一件事是SSL,特别是如果您决定使用SSL执行某些共享控制器操作或装饰整个控制器(例如shoppingcart等)
答案 3 :(得分:2)
您正在使用的每个离散单元都应该有一个控制器。所以,如果你的控制器管理多个实体,那么是的,我会说是时候把它分解了。但是,控制器的长度没有区别。
现在,您使用单独控制器的唯一问题是您的路线,但可以通过以下任一方式轻松解决:
使用区域。区域允许您排序创建子MVC项目。它会在新的前缀下为您提供Controller,Model和View目录。因此,如果您的ItemsController
区域中有一个名为Store
的控制器,则默认路由最终将为Store/Items
。然而,C#开发者对于区域有着非常复杂的感受:有些人喜欢他们,有些人则厌恶他们。
使用属性路由。 MVC 5有一项称为属性路由的新功能。这允许您直接在控制器及其操作上指定路由,而不是依赖于默认路由或向路由配置添加大量自定义路由。因此,您可以轻松拥有任意数量的控制器,并指定它们都应在URL中以“store”为前缀。只要URL的其余部分没有冲突,你就可以了。如果您不使用MVC 5项目并且不想升级,那么还有一个名为AttributeRouting的Nuget包提供这些功能(实际上更多)。对于它的价值,该软件包的作者也是MVC 5中属性路由的作者。
答案 4 :(得分:1)
如果您的方法真正与“Store”相关并将您的模型绑定到View,那么这是一回事。但是,如果您的某些“Store”方法本质上是辅助类,也就是说,这些方法不直接与您的视图交互,但在使用Store模型时确实有用,那么创建一个单独的“Store”帮助程序类和位置例如,在您的根目录中的“HelperClasses”文件夹中。在我看来,我确信其他人的意见,你想要尝试只保留控制器中直接与视图呈现和使用的模型(商店模型)相关联的方法。这鼓励了“关注点分离”。如果您的Store方法不这样做,请将它们发送给帮助程序类。基本上 - 在将模型渲染到视图时,您的控制器充当中间人。它有助于控制流程,因此Store控制器中的每个方法都应该与控制器将模型发送到View的方式有关。希望这是有道理的。
正如Chris Pratt所提到的,如果您的控制器管理多个对象,那么将它们分成单独的控制器, OR ,创建一个ViewModel
来处理多个对象,但是从你的说,我不认为是这种情况,因为你提到商店控制器中的所有内容都与“商店”相关。
答案 5 :(得分:1)
你可以考虑使用部分控制器和按逻辑含义拆分方法。
public partial class StoreController: Controller
{
public ActionResult Index()
{
return View();
}
}
在其他一些.cs或.vb文件中:
public partial class StoreController
{
public ActionResult Show()
{
return View();
}
}