Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails中依赖项注入容器的替换_Ruby On Rails_Ruby_Dependency Injection - Fatal编程技术网

Ruby on rails Rails中依赖项注入容器的替换

Ruby on rails Rails中依赖项注入容器的替换,ruby-on-rails,ruby,dependency-injection,Ruby On Rails,Ruby,Dependency Injection,我已经读了几十篇关于这方面的文章,仍然有一些问题 系统的多个部分如何使用服务?例如,我有一个permissions组件,在请求期间由其他几个类使用。现在,我把它变成了单身汉我一直使用单例作为我的域中需要在请求期间重用的部分(各种服务)的入口点。这似乎是我在系统的不同部分访问这些服务的唯一方法,而无需重新实例化它们或将它们放入全局变量。在其他系统中,我会将其设置为普通类,并将其生命周期设置为“请求”。容器将确保它在请求中共享,并释放它进行垃圾收集 我曾经考虑过使用一个服务定位器,它将服务存储在Th

我已经读了几十篇关于这方面的文章,仍然有一些问题

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

我曾经考虑过使用一个服务定位器,它将服务存储在Thread.current中。但这让我觉得我越来越绝望了

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

class A
  def some_dep
     SomeService.instance
  end
end
在测试中,
some_dep
被重写以返回模拟或其他内容。这似乎是迄今为止最好的,但仍然感觉不舒服

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

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

2) 使用服务定位器

3) 手动传递依赖项(完成灾难)

4) 辛格尔顿

两个问题:

1) 在不重新启动的情况下,向系统的多个部分提供服务的最佳方法是什么

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

注意:
我知道我可以将可重用功能放入模块中。然而,在IMO中,模块非常适合保持干燥,但不适合在系统中传输状态(即在多租户应用程序中使用哪个租户)。

DI在Ruby/Rails中从未真正流行过。有人说这是因为动态语言不需要它,但AngularJS的流行表明了另一个原因。如果您正在寻找最佳实践答案,将很难找到,因为实际上没有一个afaict。至于将对象范围限定到请求,通常不需要,因为控制器已经限定到请求的范围。因此,您创建的任何属性,例如,
@thing\u factory=ThingFactory.new
都可以在控制器方法中访问,并限定到请求的范围。我不完全确定原因。DI对于IOC的测试来说是很好的,但这不是唯一的好处。如果您使用的是好的DIC,它不仅会注入这些DEP,而且还会管理对象生命周期。一个好的DIC不仅是一个依赖注入容器,而且是一个依赖管理器。我倾向于同意Ruby/Rails可以从更多的DI约定和LIB中总体受益。另一点是Rails构建在机架上,因此许多库通常使用机架环境作为公共请求范围。