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(id_generator: Id::UuidGenerator.new) ⇒ Container

Returns a new instance of Container.

Parameters:



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

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

  @injector = Injector.new(container: self)
end

Instance Attribute Details

#id_generatorObject (readonly)

Returns the value of attribute id_generator.



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

def id_generator
  @id_generator
end

#injectorObject (readonly)

Returns the value of attribute injector.



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

def injector
  @injector
end

Instance Method Details

#add_definition(klass, id: nil, anonymous: false, &block) ⇒ String

Parameters:

  • klass (Class)

Returns:

  • (String)


24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/corindon/dependency_injection/container.rb', line 24

def add_definition(klass, id: nil, anonymous: false, &block)
  definition = if injectable?(klass)
                 klass.definition
               elsif block.sth?
                 Dsl.new(klass).exec(&block)
               else
                 Definition.new(klass)
               end

  # Generate an id if set to anonymous when registering
  # If a definition is set to be anonymous but an id is provided zhen registering, use this id instead<
  if anonymous || (definition.anonymous? && id.nil?)
    id = id_generator.generate
  end

  id = id || definition.id || to_id(klass)
  definitions[id] = definition
  definition.tags.each { |tag| tags[tag] << id }

  id
end

#get(key) ⇒ Object

Parameters:

  • key (Class, #to_s)

Returns:

  • (Object)


65
66
67
68
69
70
71
72
73
74
75
# File 'lib/corindon/dependency_injection/container.rb', line 65

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)


59
60
61
# File 'lib/corindon/dependency_injection/container.rb', line 59

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

#parameter(key) ⇒ Object

Parameters:

  • key (Class, #to_s)

Returns:

  • (Object)


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

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

#parameter?(key) ⇒ Boolean

Parameters:

  • key (Class, #to_s)

Returns:

  • (Boolean)


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

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

#set_parameter(name, value) ⇒ Object

Parameters:

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


79
80
81
# File 'lib/corindon/dependency_injection/container.rb', line 79

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

#tagged(tag) ⇒ Array<String>

Parameters:

  • tag (String)

Returns:

  • (Array<String>)


48
49
50
51
52
53
54
55
# File 'lib/corindon/dependency_injection/container.rb', line 48

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

    tags.fetch(tag)
  else
    []
  end
end