Class: Corindon::DependencyInjection::Container

Inherits:
Object
  • Object
show all
Defined in:
lib/corindon/dependency_injection/container.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(definitions: [], parameters: {}, service_built_listeners: []) ⇒ Container

Returns a new instance of Container.

Parameters:

  • definitions (Array<Definition>) (defaults to: [])


11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/corindon/dependency_injection/container.rb', line 11

def initialize(definitions: [], parameters: {}, service_built_listeners: [])
  @services = {}
  @definitions = {}
  @parameters = parameters
  @tags = Hash.new { |hash, key| hash[key] = [] }

  @injector = Injector.new(container: self)

  definitions.each { |d| register_definition(d) }

  @service_built_listeners = service_built_listeners
end

Instance Attribute Details

#injectorObject (readonly)

Returns the value of attribute injector.



8
9
10
# File 'lib/corindon/dependency_injection/container.rb', line 8

def injector
  @injector
end

Instance Method Details

#add_definition(def_or_injectable, context: {}, &block) ⇒ String

Parameters:

Returns:

  • (String)


49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/corindon/dependency_injection/container.rb', line 49

def add_definition(def_or_injectable, context: {}, &block)
  definition = as_definition(def_or_injectable)

  if block.sth?
    definition = Dsl.from_definition(definition).exec(context: context, &block)
  end

  id = definition.id || to_id(def_or_injectable)

  register_definition(
    Definition.new(
      definition.object_source,
      id: id,
      args: definition.args,
      kwargs: definition.kwargs,
      calls: definition.calls,
      tags: definition.tags
    )
  )

  id
end

#as_definition(def_or_injectable) ⇒ Definition

Parameters:

Returns:



35
36
37
38
39
40
41
42
43
44
45
# File 'lib/corindon/dependency_injection/container.rb', line 35

def as_definition(def_or_injectable)
  if def_or_injectable.is_a?(Definition)
    def_or_injectable
  elsif def_or_injectable.is_a?(Injectable)
    def_or_injectable.definition
  elsif def_or_injectable.is_a?(Class)
    Definition.new(def_or_injectable)
  else
    raise StandardError.new("Don't know how to build #{def_or_injectable}")
  end
end

#clearObject

Clears all the cache of services



90
91
92
# File 'lib/corindon/dependency_injection/container.rb', line 90

def clear
  @services = {}
end

#dupContainer

Returns:



25
26
27
28
29
30
31
# File 'lib/corindon/dependency_injection/container.rb', line 25

def dup
  Container.new(
    definitions: definitions.values,
    parameters: parameters.dup,
    service_built_listeners: service_built_listeners
  )
end

#get(key) ⇒ Object

Parameters:

  • key (Class, #to_s)

Returns:

  • (Object)


96
97
98
99
100
101
102
103
104
105
106
# File 'lib/corindon/dependency_injection/container.rb', line 96

def get(key)
  id = to_id(key)

  if has?(key)
    services.fetch(id) { build_service(id) }
  elsif injectable?(key)
    key.definition.build(injector)
  else
    raise StandardError.new("No service #{id}")
  end
end

#has?(key) ⇒ Boolean

Parameters:

  • key (Class, #to_s)

Returns:

  • (Boolean)


85
86
87
# File 'lib/corindon/dependency_injection/container.rb', line 85

def has?(key)
  definitions.key?(to_id(key))
end

#on_service_built(listener) ⇒ Object

Parameters:



127
128
129
# File 'lib/corindon/dependency_injection/container.rb', line 127

def on_service_built(listener)
  service_built_listeners << listener
end

#parameter(key) ⇒ Object

Parameters:

  • key (Class, #to_s)

Returns:

  • (Object)


122
123
124
# File 'lib/corindon/dependency_injection/container.rb', line 122

def parameter(key)
  parameters.fetch(to_id(key))
end

#parameter?(key) ⇒ Boolean

Parameters:

  • key (Class, #to_s)

Returns:

  • (Boolean)


116
117
118
# File 'lib/corindon/dependency_injection/container.rb', line 116

def parameter?(key)
  parameters.key?(to_id(key))
end

#set_parameter(name, value) ⇒ Object

Parameters:

  • key (Class, #to_s)
  • value (Object)


110
111
112
# File 'lib/corindon/dependency_injection/container.rb', line 110

def set_parameter(name, value)
  parameters[to_id(name)] = value
end

#tagged(tag) ⇒ Array<String>

Parameters:

  • tag (String)

Returns:

  • (Array<String>)


74
75
76
77
78
79
80
81
# File 'lib/corindon/dependency_injection/container.rb', line 74

def tagged(tag)
  if tags.key?(tag)

    tags.fetch(tag)
  else
    []
  end
end