如果您有一个逻辑需要在两个控制器之间共享,那么该将逻辑保存在哪里?


Answers:


12

您没有说您正在共享的逻辑是什么。简而言之,这是控制器逻辑还是辅助功能?用面向对象语言处理此问题的两种方法是继承和组合。如果两个控制器之间存在共享操作,则继承是有意义的。剩下的时间里,作文是有意义的。使用继承的示例位于分隔符下方的原始答案中。

根据您的框架而具有实用工具类或帮助器类的情况并不少见。例如,在Java和C#Web框架中,您可能具有实用程序的包/名称空间。在Ruby on Rails中,您可能会利用Helper在控制器和视图之间共享逻辑的类。基本上,它看起来像这样:

// NOTE: group similar functions
static class LoginUtility
{
    static bool IsLoggedIn(Request request) { /* ... */ }
}

或者,您可以将其设为实例化的类。上面的静态类模式的关键是使函数成为纯函数。换句话说,您传递了需要完成其工作的任何状态,并且该函数未引用系统中的任何其他静态状态。

无论哪种情况,您都可以像这样在每个控制器中访问它:

void MyAction()
{
    if (LoginUtiltiy.IsLoggedIn(Request))
    {
        // Do something ...
    }
}

原始答案

您没有说平台是什么,因为这可能会影响答案。 假定它是一种面向对象的语言,最常见的方法是创建两个控制器都扩展的基类。例如,在Ruby on Rails中,您可能具有:

class BaseController < ApplicationController
    def my_special_function
        # ...
    end
end

class Controller1 < BaseController
    # ...
end

class Controller2 < BaseController
    # ...
end

您也可以将创意翻译成其他语言。同样的方法将适用于ASP.NET MVC,Apache Wicket,Grails或几乎任何其他面向对象的Web框架。如果您的语言不是面向对象的,那么它实际上取决于如何将框架设计为最佳方法。


3
另一种方法是将逻辑封装在一个单独的类中,然后实例化该类并从两个控制器中调用逻辑。
Kramii

5
是的,我一直都喜欢继承而不是继承
Reno11,

1
请执行Kramii的建议,而不要添加额外的继承层。但是我认为他的实际问题是该课程在解决方案中的去向。
没人

1
它确实取决于功能和框架。在rails中,它可能属于Helper类。在ASP.NET或Java中,您可能具有用于该类型函数的实用程序类。这实际上取决于它与控制器之间的距离。
Berin Loritsch 2011年

这是控制器逻辑。我只是在两个地方需要它。我现在拥有的是一个扩展类,该类用于将逻辑放在一个位置。
艾琳(Erin)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.