Class: Dio::Injector

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/dio/injector.rb

Overview

Injector executes dependency injection. You can register and inject dependencies using this class.

Instance Method Summary collapse

Constructor Details

#initialize(container = Dio::Container.new, loader_factory = Dio::LoaderFactory.new) ⇒ Injector

Returns a new instance of Injector.



29
30
31
32
33
# File 'lib/dio/injector.rb', line 29

def initialize(container = Dio::Container.new, loader_factory = Dio::LoaderFactory.new)
  @container = container
  @loader_factory = loader_factory
  @original_container = nil
end

Instance Method Details

#clear_stubs(clazz = nil) ⇒ Object

Delagated.



27
# File 'lib/dio/injector.rb', line 27

def_delegators :@loader_factory, :wrap_load, :stub_deps, :reset_loader, :clear_stubs

#create(clazz, *args) ⇒ Object

Creates a new instance of the given class. Dio injects dependencies to the created instance.

Parameters:

  • clazz (Class)
  • args (Array)

Returns:

  • Instance of clazz

Raises:

  • (ArgumentError)


71
72
73
74
# File 'lib/dio/injector.rb', line 71

def create(clazz, *args)
  raise ArgumentError, "#{clazz} is not a class" unless clazz.is_a?(Class)
  inject(clazz.new(*args))
end

#inject(target) ⇒ Object

Inject dependencies to the given object.

Parameters:

  • target (Object)

Returns:

  • target



56
57
58
59
60
61
62
63
# File 'lib/dio/injector.rb', line 56

def inject(target)
  unless injectable?(target)
    raise ArgumentError, 'The given object does not include Dio module'
  end
  loader = @loader_factory.create(@container, target)
  target.__dio_inject__(loader)
  target
end

#register(key, object = nil) { ... } ⇒ Dio::Injector

Registers a new dependency with the given key. You can specify either an object or a factory block that creates an object.

Parameters:

  • key (Object)

    Typically a class or a symbol.

  • object (Object) (defaults to: nil)

Yields:

  • passed arguments when loading

Returns:



43
44
45
46
47
48
49
50
# File 'lib/dio/injector.rb', line 43

def register(key, object = nil)
  assert_register_args_valid(object, block_given?)
  @container.register(key) do |*args|
    object = yield(*args) if block_given?
    injectable?(object) ? inject(object) : object
  end
  self
end

#reset_loader(clazz = nil) ⇒ Object

Delagated.



27
# File 'lib/dio/injector.rb', line 27

def_delegators :@loader_factory, :wrap_load, :stub_deps, :reset_loader, :clear_stubs

#stub_deps(clazz, deps) ⇒ Object

Delagated.



27
# File 'lib/dio/injector.rb', line 27

def_delegators :@loader_factory, :wrap_load, :stub_deps, :reset_loader, :clear_stubs

#wrap_load(clazz, &wrapper) ⇒ Object

Delagated.



27
# File 'lib/dio/injector.rb', line 27

def_delegators :@loader_factory, :wrap_load, :stub_deps, :reset_loader, :clear_stubs