読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

サービスモデル

サービスモデルを指定することで、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がちょい新しいな。