サービスモデル
サービスモデルを指定することで、Needleのレジストリに登録したサービスの生成タイミングを制御できます。
- 指定可能なサービスモデルとしては以下のようなものが用意されています。
- このほか、deferred,initializeのサフィクスがついたモノがあります。(未調査)
- モデルを指定しない場合、デフォルトはsingletonになります。
以下はサービスモデルをいろいろ変えてサービスを定義してみるサンプルです。
require 'rubygems' require 'needle' # レジストリに登録するサービスクラス class Kitten def initialize(name) @name = name end end # レジストリを作成 registry = Needle::Registry.new {|r| # singleton(デフォルト): 常に同じインスタンスを返す r.register( :singleton ){ Kitten.new("mii") } # prototype: リクエストのたびに別のインスタンスを返す r.register( :prototype, :model=>:prototype ){ Kitten.new("mii") } # multiton: サービス取得時に引数を受け付け、引数が違えば別のインスタンスを返す。 r.register( :multiton, :model=>:multiton ){|container, service_point,name| Kitten.new(name) } # threaded: スレッドごとに別のインスタンスを返す。 r.register( :threaded, :model=>:threaded ){ Kitten.new("mii") } } puts "\n---singleton" puts registry.singleton.object_id puts registry.singleton.object_id puts "\n---prototype" puts registry.prototype.object_id puts registry.prototype.object_id puts "\n---multiton" puts registry.multiton("mii").object_id puts registry.multiton("mii").object_id puts registry.multiton("shiro").object_id # 引数が違うと別のインスタンスになる puts "\n---threaded" puts registry.threaded.object_id puts registry.threaded.object_id puts Thread.fork{ registry.threaded }.value.object_id # 別スレッドで取得すると別のインスタンスになる。
実行結果です。
---singleton 1073149780 1073149780 ---prototype 1073149550 1073149420 ---multiton 1073149190 1073149190 1073148930 ---threaded 1073148770 1073148770 1073148470
multitonがちょい新しいな。