You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby新手求助:如何用dry-rb拆分注册容器及适配auto-injector?

拆分dry-rb容器为多个功能模块的正确方法

你之前用include模块的方式行不通,因为Dry::Container::Mixin是通过extend来添加类方法(比如register)的,而include只会把模块的实例方法添加到类中,主容器类自然无法获取到SomeFeatureContainer里的注册逻辑。

下面是两种可行的拆分方式:

方法1:使用容器的import方法(推荐)

dry-container原生支持导入其他容器的注册项,这是官方推荐的拆分方式,还能通过前缀避免键名冲突。

module SomeFeatureContainer
  extend Dry::Container::Mixin

  register "some_service" do
    SomeService.new
  end
end

class Container
  extend Dry::Container::Mixin
  # 直接导入整个容器的注册项
  import SomeFeatureContainer
  # 或者给导入的项加前缀,避免命名冲突
  # import some_feature: SomeFeatureContainer
end

IocResolve = Dry::AutoInject(Container)

如果用了前缀,注入时需要使用带前缀的键:

class MyClass
  include IocResolve["some_feature.some_service"]
end

方法2:通过extend模块注入注册逻辑

把功能模块的注册逻辑写在self.extended钩子中,然后主容器extend这个模块,模块里的注册代码会在主容器被extend时自动执行:

module SomeFeatureContainer
  def self.extended(base)
    base.register "some_service" do
      SomeService.new
    end
  end
end

class Container
  extend Dry::Container::Mixin
  extend SomeFeatureContainer
end

IocResolve = Dry::AutoInject(Container)

内容的提问来源于stack exchange,提问作者Zeljko Predjeskovic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 15:22:40