Ruby on rails 按照正确的工厂模式从控制器调用服务方法
我有以下课程Ruby on rails 按照正确的工厂模式从控制器调用服务方法,ruby-on-rails,ruby,oop,factory-pattern,Ruby On Rails,Ruby,Oop,Factory Pattern,我有以下课程 class EvaluateService def initialize end def get_url end def self.evaluate_service @instance ||= new end end class CheckController < ApplicationController def index get_url = EvaluateService.get_url end end 类评估服务
class EvaluateService
def initialize
end
def get_url
end
def self.evaluate_service
@instance ||= new
end
end
class CheckController < ApplicationController
def index
get_url = EvaluateService.get_url
end
end
类评估服务
def初始化
结束
def获取url
结束
def自我评估服务
@实例| |=新建
结束
结束
类CheckController
这里的问题是,我知道我可以做evaluate\u service=EvaluateService.new
并使用对象evaluate\u service.get\u url
,它会很好地工作,但我也知道有些人不赞成用这种方式初始化服务对象,而是有一种通过调用初始化它的方法,服务类中的send方法
只是想知道我该怎么做?有多种方法可以实现这一点 如果
EvaluateService
中的方法不需要状态,您可以只使用类方法,例如:
class EvaluateService
def self.get_url
# ...
end
end
class CheckController < ApplicationController
def index
@url = EvaluateService.get_url
end
end
但全局对象可能很棘手
或者,您可以在控制器中使用帮助器方法来创建服务实例(根据需要)并将其记忆:
class EvaluateService
def get_url
# ...
end
end
class CheckController < ApplicationController
def index
@url = evaluate_service.get_url
end
private
def evaluate_service
@evaluate_service ||= EvaluateService.new
end
end
类评估服务
def获取url
# ...
结束
结束
类CheckController
甚至可以将其移动到您的
应用程序控制器上
有多种方法可以实现这一点
如果EvaluateService
中的方法不需要状态,您可以只使用类方法,例如:
class EvaluateService
def self.get_url
# ...
end
end
class CheckController < ApplicationController
def index
@url = EvaluateService.get_url
end
end
但全局对象可能很棘手
或者,您可以在控制器中使用帮助器方法来创建服务实例(根据需要)并将其记忆:
class EvaluateService
def get_url
# ...
end
end
class CheckController < ApplicationController
def index
@url = evaluate_service.get_url
end
private
def evaluate_service
@evaluate_service ||= EvaluateService.new
end
end
类评估服务
def获取url
# ...
结束
结束
类CheckController
甚至可以将其移动到您的
应用程序控制器
我认为您需要的是:
class Evaluate
def initialize(foo)
@foo = foo
end
def self.call(foo)
new(foo).call
end
def call
url
end
private
def url
# Implement me
end
end
现在,您可以在控制器中执行此操作:
class CheckController < ApplicationController
def index
@url = Evaluate.call(params)
end
end
class CheckController
一些人喜欢将
#call
作为入口点的原因是它与lambdas是多态的。也就是说,在任何可以使用lambda的地方,都可以将其替换为Evaluate
,反之亦然。我认为您需要的是:
class Evaluate
def initialize(foo)
@foo = foo
end
def self.call(foo)
new(foo).call
end
def call
url
end
private
def url
# Implement me
end
end
现在,您可以在控制器中执行此操作:
class CheckController < ApplicationController
def index
@url = Evaluate.call(params)
end
end
class CheckController
一些人喜欢将
#call
作为入口点的原因是它与lambdas是多态的。也就是说,在任何可以使用lambda的地方,都可以将其替换为Evaluate
的实例,反之亦然。基本上,我就是这样做的。但是,你能不能扩展一下你的评论,说它是“lambdas的多态性”?我添加了一个简短的补充,但是如果你不知道多态性是什么,你应该去了解它。这是Ruby最基本的概念之一。谢谢!我想,也许,我已经做了很长一段时间的“lambas多态性”了,而不知道它有一个实际的名字。每天学习新的东西。再次感谢您周到的回复。基本上,我就是这样做的。但是,你能不能扩展一下你的评论,说它是“lambdas的多态性”?我添加了一个简短的补充,但是如果你不知道多态性是什么,你应该去了解它。这是Ruby最基本的概念之一。谢谢!我想,也许,我已经做了很长一段时间的“lambas多态性”了,而不知道它有一个实际的名字。每天学习新的东西。再次感谢您周到的回复。