# Matz DI -- Constructor Injection
#
# Usage:
#
# def start_app
# c = DI::Container.new
# c.register(:blog, Blog, :input, :display)
# c.register(:input, Input)
# c.register(:dbms, DBMS)
# c.register(:markup, Markup)
# c.register(:plugin, Plugin, :dbms)
# c.register(:display, Display, :dbms, :markup, :plugin)
# blog = c.instance(:blog)
# end
module DI
class Container
def initialize
@services = {}
@instances = {}
end
def register(name, component, *dependency)
@services[name] = [component, dependency]
end
def instance(name)
return @instances[name] if @instances[name]
component, dependency = @services[name]
args = dependency.map {|service|
self.instance(service)
}
@instances[name] = component.new(*args)
end
end
end
|