diff --git a/README.md b/README.md index 6b7331d..d2cfb99 100644 --- a/README.md +++ b/README.md @@ -249,7 +249,7 @@ require 'dependor/shorty' class MyInjector include Dependor::AutoInject - + takes :params, :session, :request def foo @@ -274,6 +274,38 @@ class PostsController < ApplicationController end ``` +## Dependor::Singleton + +You can include this to make your service class as a singleton. + +```ruby +class FooService + include Dependor::Singleton +end + +class MyInjector + include Dependor::AutoInject + + takes :params, :session, :request +end + +class ApplicationController + extend Dependor::Injectable + + def injector + @injector ||= MyInjector.new(params, session, request) + end +end + +class PostsController < ApplicationController + inject :foo_service + + def get + render text: foo_service.object_id == foo_service.object_id # true + end +end +``` + ## Testing Dependor doesn't add any dependencies to your classes so you can test them any way you like. diff --git a/lib/dependor.rb b/lib/dependor.rb index ed08f9c..8e472c1 100644 --- a/lib/dependor.rb +++ b/lib/dependor.rb @@ -10,6 +10,7 @@ module Dependor autoload :Injectable, 'dependor/injectable' autoload :Instantiator, 'dependor/instantiator' autoload :Isolate, 'dependor/isolate' + autoload :Singleton, 'dependor/singleton' autoload :Let, 'dependor/let' autoload :SendingInjector, 'dependor/sending_injector' autoload :Shorty, 'dependor/shorty' diff --git a/lib/dependor/instantiator.rb b/lib/dependor/instantiator.rb index 635feea..5a6d276 100644 --- a/lib/dependor/instantiator.rb +++ b/lib/dependor/instantiator.rb @@ -5,11 +5,16 @@ class Instantiator def initialize(injector, dependency_names) @injector = injector @dependency_names = dependency_names + @singletons = {} end def instantiate(klass) dependencies = dependency_names.for_class(klass).map{|name| @injector.get(name)} - return klass.new(*dependencies) + if klass.include?(Dependor::Singleton) + return @singletons[klass] ||= klass.new(*dependencies) + else + return klass.new(*dependencies) + end end end end diff --git a/lib/dependor/singleton.rb b/lib/dependor/singleton.rb new file mode 100644 index 0000000..a2a5c46 --- /dev/null +++ b/lib/dependor/singleton.rb @@ -0,0 +1,4 @@ +module Dependor + module Singleton + end +end diff --git a/spec/dependor/instantiator_spec.rb b/spec/dependor/instantiator_spec.rb index ca11dfc..f06f7cb 100644 --- a/spec/dependor/instantiator_spec.rb +++ b/spec/dependor/instantiator_spec.rb @@ -35,4 +35,24 @@ def foo instance.foo.should == 'foo-bar-baz' end + + it "instantiates objects as a new object" do + klass = Class.new {} + + first_instance = instantiator.instantiate(klass) + second_instance = instantiator.instantiate(klass) + + first_instance.object_id.should_not == second_instance.object_id + end + + it "instantiates objects as a singleton object" do + klass = Class.new do + include Dependor::Singleton + end + + first_instance = instantiator.instantiate(klass) + second_instance = instantiator.instantiate(klass) + + first_instance.object_id.should == second_instance.object_id + end end