Rails 服务对象和控制器
Rails service objects and controller
我有一个同事喜欢将控制器传递给服务对象。例如,控制器方法可能如下所示:
class FooController < ApplicationController
...
def show
Foo.new(self).call
end
...
end
服务对象如下所示:
class Foo
attr_reader :controller, :resource_id
delegate :render, :params, :head, to: :controller
def initialize(controller, resource_id)
@controller = controller
@resource_id = resource_id
end
def call
resource = SomeActiveRecordModel.find(resource_id)
if resource
render json: resource.to_json
else
head :not_found
end
end
end
不知怎的,我觉得这是适得其反的,是货物崇拜软件工程的一个例子。
我更愿意将服务对象与控制器完全分开。依赖项将传递到服务对象的构造函数中,参数将作为方法参数传递到服务对象中。任何结果都只是从该方法返回。
可悲的是,每当我在代码审查中提到它时,我的同事们对此并不十分兴奋,而我又觉得这相对令人沮丧。
各种方法的优缺点是什么?我怎样才能更好地论证我的案子?我在这里遗漏了什么吗?
我怀疑答案是"it depends"。
在您给出的确切示例中,我看不出有什么特别的优势,而且它造成了一定程度的混淆。另外,总的来说,我同意你将服务对象与控制器分开。
但是,有时我发现自己将控制器传递给服务对象。例如,当我在动态构建视图时有很多复杂的工作要做。
我有一个同事喜欢将控制器传递给服务对象。例如,控制器方法可能如下所示:
class FooController < ApplicationController
...
def show
Foo.new(self).call
end
...
end
服务对象如下所示:
class Foo
attr_reader :controller, :resource_id
delegate :render, :params, :head, to: :controller
def initialize(controller, resource_id)
@controller = controller
@resource_id = resource_id
end
def call
resource = SomeActiveRecordModel.find(resource_id)
if resource
render json: resource.to_json
else
head :not_found
end
end
end
不知怎的,我觉得这是适得其反的,是货物崇拜软件工程的一个例子。
我更愿意将服务对象与控制器完全分开。依赖项将传递到服务对象的构造函数中,参数将作为方法参数传递到服务对象中。任何结果都只是从该方法返回。
可悲的是,每当我在代码审查中提到它时,我的同事们对此并不十分兴奋,而我又觉得这相对令人沮丧。
各种方法的优缺点是什么?我怎样才能更好地论证我的案子?我在这里遗漏了什么吗?
我怀疑答案是"it depends"。
在您给出的确切示例中,我看不出有什么特别的优势,而且它造成了一定程度的混淆。另外,总的来说,我同意你将服务对象与控制器分开。
但是,有时我发现自己将控制器传递给服务对象。例如,当我在动态构建视图时有很多复杂的工作要做。