Class: SmartIoC::Container

Inherits:
Object
  • Object
show all
Includes:
Args
Defined in:
lib/smart_ioc/container.rb

Overview

SmartIoC::Container is a beans store used for dependency injection

Constant Summary collapse

DEFAULT_CONTEXT =
:default

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Args

#check_arg, #check_arg_any, #not_nil

Constructor Details

#initializeContainer

Returns a new instance of Container.

Raises:

  • (ArgumentError)


22
23
24
# File 'lib/smart_ioc/container.rb', line 22

def initialize
  raise ArgumentError, "SmartIoC::Container should not be allocated. Use SmartIoC::Container.get_instance instead"
end

Class Method Details

.clearObject



13
14
15
# File 'lib/smart_ioc/container.rb', line 13

def clear
  @container = nil
end

.get_bean(bean_name, package: nil, context: nil) ⇒ Object



17
18
19
# File 'lib/smart_ioc/container.rb', line 17

def get_bean(bean_name, package: nil, context: nil)
  get_instance.get_bean(bean_name, package: package, context: context)
end

.get_instanceObject



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

def get_instance
  @container ||= SmartIoC::Container.allocate
end

Instance Method Details

#clear_scopesObject



124
125
126
# File 'lib/smart_ioc/container.rb', line 124

def clear_scopes
  bean_factory.clear_scopes
end

#force_clear_scopesObject



128
129
130
# File 'lib/smart_ioc/container.rb', line 128

def force_clear_scopes
  bean_factory.force_clear_scopes
end

#get_bean(bean_name, package: nil, context: nil) ⇒ Object



120
121
122
# File 'lib/smart_ioc/container.rb', line 120

def get_bean(bean_name, package: nil, context: nil)
  bean_factory.get_bean(bean_name, package: package, context: context)
end

#get_bean_definition_by_class(klass) ⇒ Object

Returns bean definition for specific class return [BeanDefinition]



95
96
97
# File 'lib/smart_ioc/container.rb', line 95

def get_bean_definition_by_class(klass)
  bean_definitions_storage.find_by_class(klass)
end

#register_bean(bean_name:, klass:, context:, scope:, path:, factory_method: nil, package_name: nil, instance: true) ⇒ SmartIoC::BeanDefinition



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/smart_ioc/container.rb', line 40

def register_bean(bean_name:, klass:, context:, scope:, path:,
                  factory_method: nil, package_name: nil, instance: true)
  context ||= DEFAULT_CONTEXT

  check_arg(bean_name, :bean_name, Symbol)
  check_arg(context, :context, Symbol)
  check_arg(klass, :klass, Class)
  check_arg(path, :path, String)
  check_arg(factory_method, :factory_method, Symbol) if factory_method
  check_arg_any(instance, :instance, [TrueClass, FalseClass])

  scope ||= SmartIoC::Scopes::Singleton::VALUE

  allowed_scopes = [
    SmartIoC::Scopes::Prototype::VALUE,
    SmartIoC::Scopes::Singleton::VALUE,
    SmartIoC::Scopes::Request::VALUE
  ]

  if !allowed_scopes.include?(scope)
    raise ArgumentError, "bean scope should be one of #{allowed_scopes.inspect}"
  end

  package_name ||= SmartIoC::BeanLocations.get_bean_package(path)

  if !package_name
    raise ArgumentError, %Q(
      Package name should be given for bean :#{bean_name}.
      You should specify package name directly or run

      SmartIoC.find_package_beans(package_name, dir)

      to setup beans before you actually register them.
    )
  end

  bean_definition = SmartIoC::BeanDefinition.new(
    name:           bean_name,
    package:        package_name,
    path:           path,
    klass:          klass,
    instance:       instance,
    factory_method: factory_method,
    context:        context,
    scope:          scope
  )

  bean_definitions_storage.push(bean_definition)

  bean_definition
end

#set_extra_context_for_package(package_name, context) ⇒ Object

Sets extra context for specific package



112
113
114
# File 'lib/smart_ioc/container.rb', line 112

def set_extra_context_for_package(package_name, context)
  extra_package_contexts.set_context(package_name, context)
end

#set_load_proc(&proc) ⇒ Object

Sets new load proc for those who use active support dependency loader one can use SmartIoC.set_load_proc do |location|

require_dependency(location)

end



105
106
107
# File 'lib/smart_ioc/container.rb', line 105

def set_load_proc(&proc)
  bean_factory.bean_file_loader.set_load_proc(&proc)
end

#unregister_bean(klass) ⇒ Object



28
29
30
31
32
# File 'lib/smart_ioc/container.rb', line 28

def unregister_bean(klass)
  bean_definitions_storage.delete_by_class(klass)
  clear_scopes
  nil
end