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
相关产品推荐
相关产品推荐

