Answers:
您没有说您正在共享的逻辑是什么。简而言之,这是控制器逻辑还是辅助功能?用面向对象语言处理此问题的两种方法是继承和组合。如果两个控制器之间存在共享操作,则继承是有意义的。剩下的时间里,作文是有意义的。使用继承的示例位于分隔符下方的原始答案中。
根据您的框架而具有实用工具类或帮助器类的情况并不少见。例如,在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框架。如果您的语言不是面向对象的,那么它实际上取决于如何将框架设计为最佳方法。