Techioz Blog

Ruby dry-rbを使用して登録コンテナを分離するにはどうすればよいですか?

概要

Ruby の初心者が dry-rb gem、特に自動インジェクターを検討するときに、登録コンテナをモジュールとして複数の機能に分割する方法はありますか?

これは私が試してみましたが動作しなかったコードサンプルです。

module SomeFeatureContainter
    extend Dry::Container::Mixin

    register "some_service" do
        SomeService.new
    end
    
end


class Container
    extend Dry::Container::Mixin
    include SomeFeatureContainter

    
end

IocResolve = Dry::AutoInject(Container)

解決策

制御の反転を実現するには、インスタンス化されたオブジェクトを通じてサービスを呼び出す前に、コンテナーを定義し、インジェクターを設定します。

require 'dry-auto_inject'


class SomeService
  # your service definition
end

module SomeFeatureContainer
  extend Dry::Container::Mixin

  register 'some_service' do
    SomeService.new
  end
end

class Container
  extend Dry::Container::Mixin
  configure { |config| config.auto_inject = true }
  include SomeFeatureContainer

  # define the injector
  IocResolve = Dry::AutoInject(self)
end

class MyClass
  include Container::IocResolve[:some_service]

  def use_some_service
    some_service.call
  end
end

# invoke the service with MyClass
my_instance = MyClass.new
my_instance.use_some_service````