極簡Ruby依賴注入框架:Dim
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 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!
