極簡Ruby依賴注入框架:Dim

jopen 10年前發布 | 14K 次閱讀 Dim Ruby開發

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

項目主頁:http://www.baiduhome.net/lib/view/home/1394782168025

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