Rails中依赖注入容器的替换

时间:2014-01-21 10:44:01

标签: ruby-on-rails ruby dependency-injection

我已经阅读了很多关于此的文章,但仍有一些问题。

如何在系统的多个部分中使用服务?例如,我有一个权限组件,在请求期间由其他几个类使用。现在,我已经把它变成了单身人士。 我一直使用单例作为我的部分域名(各种服务)的入口点,需要在请求期间重复使用。这似乎是我可以在不同部分访问这些服务的唯一方法。系统没有重新实例化它们或没有将它们抛在全局变量中。在其他系统中,我会将它设为普通类,并将其生命周期设置为“请求”。容器将确保它在请求中共享并释放它以进行垃圾收集。

我考虑过使用服务定位器来存储 Thread.current 中的服务。但这感觉就像我变得绝望了。

我看到人们访问这些依赖关系的主要方式是将依赖包装在一个方法中:

class A
  def some_dep
     SomeService.instance
  end
end

在测试中,重写some_dep以返回模拟或其他内容。这似乎是迄今为止最好的,但仍然感到hackish。

我在请求中使用服务的选项似乎是:

1)将它们放在全局变量/ Thread.current中。

2)使用服务定位器。

3)手动传递依赖关系(完全灾难)。

4)Singleton。

两个问题:

1)在不重新实例化的情况下,为系统的多个部分提供服务的最佳方法是什么?

2)类管理这些依赖项的最佳方法是什么?

注意: 我知道我可以将可重用的功能放入模块中。然而,IMO模块非常适合保持DRY,但不适用于系统周围的状态(即您在多租户应用程序中使用的租户)。

0 个答案:

没有答案