2018-01-27

dry-container, dry-auto_inject

昨日の夜に途中まで触っていたdry-container, dry-auto_injectも使いかたを理解できた。これはDIコンテナを実現するもの。DIについて雑に理解を得るには、この記事を読めばよい。

DI・DIコンテナ、ちゃんと理解出来てる・・? – Qiita

上の記事の中のコードをdry-container, dry-auto_injectを使って書き直してみた。

require 'dry-auto_inject'
require 'logger'

class FileLogger
  def initialize(filename)
    @logger = Logger.new('example.log')
  end
end

class TwitterLogger
  def initialize(logger)
    @logger = logger
  end
end

class SampleContainer
  extend Dry::Container::Mixin

  register('file_logger_factory', call: false) do |filename|
    FileLogger.new(filename)
  end

  register 'twitter_manager' do
    TwitterLogger.new(resolve('file_logger_factory').call('twitter.log'))
  end

  register 'database.authenticator' do
    DatabaseUserAuthenticator.new
  end
end

class Sample
  include Dry::AutoInject(SampleContainer)['file_logger_factory', 'twitter_manager']

  attr_reader :file_logger

  def initialize(*args)
    super(*args)
    @file_logger = file_logger_factory.call('example.log')
  end
end

sample = Sample.new
pp sample.file_logger
pp sample.twitter_manager

次の出力が得られる。

#<FileLogger:0x00007fa9ee8c6c08
 @logger=
  #<Logger:0x00007fa9ee8c6bb8
   @default_formatter=
    #<Logger::Formatter:0x00007fa9ee8c6a28 @datetime_format=nil>,
   @formatter=nil,
   @level=0,
   @logdev=
    #<Logger::LogDevice:0x00007fa9ee8c69d8
     @dev=#<File:example.log>,
     @filename="example.log",
     @mon_count=0,
     @mon_mutex=#<Thread::Mutex:0x00007fa9ee8c6988>,
     @mon_owner=nil,
     @shift_age=0,
     @shift_period_suffix="%Y%m%d",
     @shift_size=1048576>,
   @progname=nil>>
#<TwitterLogger:0x00007fa9ee8c7220
 @logger=
  #<FileLogger:0x00007fa9ee8c7450
   @logger=
    #<Logger:0x00007fa9ee8c7400
     @default_formatter=
      #<Logger::Formatter:0x00007fa9ee8c7388 @datetime_format=nil>,
     @formatter=nil,
     @level=0,
     @logdev=
      #<Logger::LogDevice:0x00007fa9ee8c7338
       @dev=#<File:example.log>,
       @filename="example.log",
       @mon_count=0,
       @mon_mutex=#<Thread::Mutex:0x00007fa9ee8c72c0>,
       @mon_owner=nil,
       @shift_age=0,
       @shift_period_suffix="%Y%m%d",
       @shift_size=1048576>,
     @progname=nil>>>

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です