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