RubyのDIコンテナ「Needle」を使ってみる。
- インスタンスのライフサイクル管理や、インジェクションなどのDIコンテナの基本的な機能をサポート。
- 設定ファイルを利用せず、プログラム上でサービスを登録する方式が採用されています。Guiceライク。
- AOP機能も提供されているようです。
インストール
gem経由で。
$ gem install needle
簡単なレジストリのサンプル
サービスを登録して取得するところまでの簡単なレジストリのサンプルです。
require 'rubygems' require 'needle' # レジストリに登録するサービスクラス class Kitten def initialize(name) @name = name end def meow( count ) @out.puts "#{@name} : #{'meow!' * count}" end attr :out, true end # レジストリを作成 registry = Needle::Registry.define {|builder| # 「b.<サービスID>」でサービスを登録 # ブロックの結果がサービスIDに対応するサービスとして登録される。 builder.out { STDOUT } builder.mii { k = Kitten.new("mii") # レジストリに登録されている「out」をインジェクト k.out = builder.out k } } # サービスを取得して使ってみる。 mii = registry[:mii] mii.meow(3) # ちなみにデフォルトはシングルトン # 同じオブジェクトが返される。 puts registry[:mii].object_id puts registry[:mii].object_id
実行結果です。
mii : meow!meow!meow! 1073187910 1073187910
なかなかよさそう。設定ファイルなしにさくっと使えるのがいいなー。インジェクションが手動なのがやや面倒だけど、コンポーネントの自動インジェクション機能とかあるのかな?要調査。