2014-02-19 23 views
0

在閱讀Sandi Metz的「面向對象的Ruby實用設計」之後,我決定在Ruby中使用一個小型服務(例如Sinatra或Grape)。在不使用DI框架的情況下在Ruby中注入依賴關係的技術

到目前爲止,我想出了一個辦法注入依賴於類變量:

# Service Object 
class AppClient 
    cattr_accessor :http_client # class variable to be injected 

    def self.configure &block # help method to set the class variables 
    yield(self) 
    end 

    def save 
    response = http_client.put(url, body: body, params: {}) # use (simplified) 
    end 
end 

# Initializer 
AppClient.configure do |config| 
    config.http_client = Typhoeus # DI (we inject the dependency here) 
end 

你覺得這個例子是注入依賴的好辦法?你知道其他技術嗎?

注:我知道,依賴注入通常是用Ruby不必要的(但這不是問題等都不是複製一個) Does dependency injection exist in Rails? Ruby dependency injection libraries

回答

0

看起來好像沒什麼問題。類是Ruby中的對象,因此依賴注入只是在運行時設置一個變量。在你的情況下,你正在設置AppClient類的@http_client實例變量。一旦該變量被需要實現的代碼訪問,那麼您將配置應用程序的類將被返回,只要它響應正確的消息,它就會完成這項工作。

但要小心。請記住,類是在單個Ruby進程中共享的單例對象。其他代碼可以調用該訪問器方法並更改該變量。這可能發生在任何時候,而不僅僅是在啓動時,並且會影響所有使用實現的代碼。存在衝突的可能性。

這使得這種模式特別不適合在庫中使用。在這種情況下,將實現類作爲參數傳遞給調用站點應該是更健壯的解決方案。

相關問題