2010-01-15 48 views
2

控制器在包含大量操作时可能变得庞大笨重。这是现实世界使用中的一个重要问题,如果有的话,有什么策略可以缓解它(或者是否足够好,以简化每个控制器的操作数)?避免MVC中的大型控制器

关闭我的头顶我可以设想控制器将逻辑卸载到其他类型的操作实现,并根据一些有意义的启发式进行分组。

回答

3

根据我的经验,这种情况主要发生在我没有积极应用“REST”刀的情况下。有时候,这个比喻与我们思考问题的方式不一致。例如,很容易认为“登录”是对“帐户”的操作,但是如果您应用REST刀,则意识到登录实际上是“开始新的会话”,并且通过应用“新的“(或创建)对SessionController的操作。然后你有一个小控制器负责创建和销毁会话(登录和注销)。

我敢肯定,有些人不会喜欢用混乱的身份验证概念来混淆REST水域,所以我们来看一个更明显的例子。我可以有一个BlogPost实体,它可以有一堆评论。我没有在BlogPostController上添加操作AddComment,而是在BlogPost上有通常的创建/编辑/删除方法,而另一个控制器的CommentController的新建/创建操作需要BlogPostId,并实现了创建/编辑/删除方法。

我遇到过一些我需要类似非REST的操作的情况,比如“从CSV文件导入X的列表”,每个人都属于Y; “列表”作为一个领域概念并不重要,因为我只是试图添加到现有的Xes集合中。在那种情况下,我将我认为是一个稍微丑陋的方法添加到我的XController中的“导入”操作。该代码是我控制器中最麻烦的代码,我倾向于将它分解为更多责任(一个XImporter类,也许),但现在它“起作用”。我敢肯定,比我更聪明的人会有更好的解决方案。

所以我的论点是这样的:如果你有很多un-RESTy动作,就会有一种代码异味;也许你不是在建模你正确控制的东西。但是,如果你有话说,1-3次不重要的行为并试图重新思考这个问题并不会导致你走向正确的方向,或许这不值得担忧。