Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在一个控制器中有很多方法,而不是有多个控制器_C#_Asp.net Mvc - Fatal编程技术网

C# 在一个控制器中有很多方法,而不是有多个控制器

C# 在一个控制器中有很多方法,而不是有多个控制器,c#,asp.net-mvc,C#,Asp.net Mvc,我正在开发一个应用程序,我正在思考一些事情。所以我想我会请有经验的人告诉我他们是怎么想的 所以我有一个巨大的控制器(商店控制器),里面有很多方法,Get和Post动作,等等。它工作得很好,但我仍处于开发阶段 我想知道最好的做法是什么:让这个控制器包含这么多的方法和操作,还是将这些方法拆分为多个控制器?让一个控制器处理几乎所有的方法是理想的,还是多个控制器 在你问之前,是的,我的商店控制器中的所有东西都是“与商店相关的”。但在我的商店里,我有商品、包装等等 编辑 谢谢大家!按照你的建议,我已经将我

我正在开发一个应用程序,我正在思考一些事情。所以我想我会请有经验的人告诉我他们是怎么想的

所以我有一个巨大的控制器(商店控制器),里面有很多方法,Get和Post动作,等等。它工作得很好,但我仍处于开发阶段

我想知道最好的做法是什么:让这个控制器包含这么多的方法和操作,还是将这些方法拆分为多个控制器?让一个控制器处理几乎所有的方法是理想的,还是多个控制器

在你问之前,是的,我的商店控制器中的所有东西都是“与商店相关的”。但在我的商店里,我有商品、包装等等

编辑


谢谢大家!按照你的建议,我已经将我巨大的
存储
控制器拆分为更小的控制器:一个用于物品,一个用于包装,等等。这确实使代码更具可读性。此外,提供的许多评论将使我进入升级的轨道,所以非常感谢

我更喜欢多个控制器,而不是有许多动作的单个控制器。我会这样做-让BaseStoreController从控制器派生,这个控制器将具有通用的功能和属性。然后从BaseStoreController派生StorePackageController、StoreItemsController等


在每个控制器中,我将有与包、项目等相关的相应操作。在每个操作中,我将确保使用命令模式和外观模式来确保正确的代码分离。

我的标准方法是每个菜单选项有一个控制器

例如,假设您有一个带有菜单选项的站点

主页、产品、博客、常见问题解答等

我会有一个HomeController、ProductContsController、BlogController和FAQController

您还可以创建一个或两个通用控制器,用于处理网站多个部分使用的共享操作,并创建一个基础控制器,而不是处理跟踪和记录页面访问等通用任务


另一件需要注意的事情是SSL,特别是如果您决定使用SSL执行一些共享控制器操作或装饰整个控制器(例如shoppingcart等),那么最好将所有控制器的操作划分为一些逻辑包,以便将它们移动到单独的控制器。多亏了这一点,这一切变得更加可读和直观,你也为其他开发人员谁将工作的项目

问题是:如何划分它

事实上,有几个标准可以影响此类决策,例如:

  • 控制器应与一组逻辑连接的页面连接。例如,对于电子商务平台,您可能会有一个CheckoutController、ProductController、UserAccountController等
  • 您还应该考虑应该考虑哪些业务概念。在您的案例中,您有一个概念库,但您可能已经意识到这一点,它本身就是一个非常广泛的概念。因此,您可能应该在业务概念中区分更多细节
一种非常常见的方法是用积垢划分控制器,尽管它并不总是适用。 另一方面,你的控制器不应该太颗粒化,所以你不应该夸大它


请记住,ASP.NET MVC使用CoC(约定优先于配置)方法,该方法也适用于控制器和视图命名约定及其分组和放置在适当目录中的方式。在划分控制器时,应考虑这一点

您应该为正在使用的每个离散单元配备一个控制器。所以,如果你的控制器管理多个实体,那么是的,我认为是时候打破它了。然而,控制器的长度,否则,并没有区别

现在,使用单独的控制器会遇到的唯一问题是路由,但这可以通过以下任一方法轻松解决:

  • 使用区域。区域允许您在某种程度上创建一个子MVC项目。它将为您提供控制器、模型和视图目录,所有目录都使用新前缀。因此,如果在
    Store
    区域中有一个名为
    ItemsController
    的控制器,则默认路径将最终为
    Store/Items
    。然而,C#开发者对这些领域有着复杂的感受:有些人喜欢它们,有些人怀着强烈的激情憎恨它们

  • 使用属性路由。MVC 5有一个新功能,称为属性路由。这允许您直接在控制器上指定路由及其操作,而不是依赖默认路由或向路由配置中添加大量自定义路由。因此,您可以轻松地拥有任意数量的控制器,并指定它们在URL中都应以“store”作为前缀。只要URL的其余部分没有冲突,就可以了。如果您不使用MVC5项目并且不想升级,那么还有一个名为AttributeRouting的Nuget包,它提供了这些功能(实际上还有更多功能)。值得一提的是,该包的作者也是MVC5中属性路由的作者

  • 如果您的方法确实与“存储”相关并将模型绑定到视图,那么这是一回事。但是,如果某些“存储”方法本质上是帮助类,即不直接与视图交互但在使用存储模型时确实起作用的方法,则创建一个单独的“存储”帮助类,并将其放置在根目录中的“帮助类”文件夹中。在我看来,我相信其他人的观点,您希望在控制器中只保留直接绑定到视图渲染和使用的模型(存储模型)的方法。T
    public partial class StoreController: Controller
    {
        public ActionResult Index()
        {
            return View();
        }
    }
    
    public partial class StoreController
    {
        public ActionResult Show()
        {
            return View();
        }
    }