极简Ruby依赖注入框架:Dim
jopen
11年前
DIM是一个极简依赖注入框架。
依赖注入通过创建容器来帮助你组织应用的对象初始化代码。当应用中的对象需要访问其他对象或资源的时候,它要求容器来提供(通过惰性加载的代码区块)。
例子
在lib.init.rb
中加入如下代码:(Rails应用使用config/initializers/container.rb
)
require "dim" require "logger" require 'game' require 'event_handler' require 'transmitter' ServerContainer = Dim::Container.new ServerContainer.register(:transmitter) { |c| Transmitter.new(c.logger) } ServerContainer.register(:event_handler) do |c| eh = EventHandler.new eh.transmitter = c.transmitter eh.logger = c.logger eh end ServerContainer.register(:listening_host) { "0.0.0.0" } ServerContainer.register(:listening_port) { "8080" } ServerContainer.register(:game) do |c| game = Game.new game.logger = c.logger game.event_handler = c.event_handler game.host = c.listening_host game.port = c.listening_port game end ServerContainer.register(:root_dir) do |c| Pathname.new(File.expand_path(File.dirname(__FILE__) + "/..")) end ServerContainer.register(:log_file_path) do |c| "#{c.root_dir}/log/#{c.environment}.log" end ServerContainer.register(:logger) do |c| Logger.new(c.log_file_path) end # attempts to read ENV["API_PASSWORD"], otherwise makes sure that the parent container has # a service named api_password registered ServerContainer.register_env(:api_password)当你需要引用logger对象的时候,只需:
ServerContainer.logger.info("I didn't have to setup my own logger")
如果你需要访问game实例(初始化时已经创建好了):
current_game = ServerContainer.game
如果你不喜欢使用全局常量ServerContainer,你可以将ServerContainer本身注入对象:
World.new(GameContainer)
编译 SegmentFault