当控制器包含大量动作时,它们会变得庞大而笨重。这在实际使用中是否是一个重大问题,如果是,有什么策略可以缓解它(或者足以让每个控制器的动作计数减少)?
在我的脑海中,我可以设想控制器将逻辑卸载到其他类型的动作实现中,根据一些有意义的启发式进行分组。
当控制器包含大量动作时,它们会变得庞大而笨重。这在实际使用中是否是一个重大问题,如果是,有什么策略可以缓解它(或者足以让每个控制器的动作计数减少)?
在我的脑海中,我可以设想控制器将逻辑卸载到其他类型的动作实现中,根据一些有意义的启发式进行分组。
以我的经验,这主要发生在我没有足够积极地使用“REST”刀时。有时这个比喻与我们思考问题的方式不一致;例如,很容易认为“登录”是对“帐户”的操作,但如果您应用 REST 刀,您会意识到登录实际上是“开始一个新会话”,并且您通过应用“新"(或创建)对 SessionController 的操作。然后你有一个小控制器负责创建和销毁会话(登录和注销)。
我相信有些人不会喜欢用混乱的身份验证概念来混淆 REST 水域,所以让我们看一个更明显的例子。我可以有一个 BlogPost 实体,它可以有一堆评论。我没有在 BlogPostController 上使用 AddComment 操作,而是在 BlogPost 上使用通常的创建/编辑/删除方法,以及另一个控制器 CommentController,其新/创建操作需要一个 BlogPostId,并实现创建/编辑/删除方法。
我遇到过一些需要非 REST 类操作的情况,例如“从 CSV 文件导入 X 列表”,每个都属于 Y;“列表”作为域概念并不重要,因为我只是想添加到现有的 Xes 集合中。在这种情况下,我采用了一种我认为有点丑陋的方法,即向我的 XController 添加“导入”操作。该代码是我的任何控制器中最混乱的代码,我倾向于将其分解为具有更多责任的东西(也许是 XImporter 类),但现在它“有效”。我相信比我更聪明的人会有更好的解决方案。
所以我的论点是这样的:如果你有很多非 RESTy 的动作,就会有一种代码异味;也许你没有对你正在正确控制的东西进行建模。但是,如果您说,1-3 次 unRESTy 的行为和重新思考问题的尝试并没有将您引向正确的方向,也许这不值得担心。