2012-03-02 48 views
0

我正在使用機器人腿,我有一堆ServiceResponses,它擴展了一個基類,並對解析器,IParser有依賴關係。我需要連接一個特定於子類的解析器。以下是一個示例:Robotlegs連接屬於基類的依賴關係

ModuleConfigResponse擴展了SimpleServiceResponse並實現了IServiceResponse。

初始部分很容易在上下文線,這裏是一個例子:

injector.mapClass(IServiceResponse, ModuleConfigResponse); 
injector.mapClass(IServiceResponse, SimpleServiceResponse, "roomconfig"); 
..etc 

每個響應使用所使用的基類解析器:

injector.mapValue(IParser, ModuleConfigParser, "moduleconfig"); 
injector.mapValue(IParser, RoomConfigParser, "roomconfig"); 

的問題是如何把這些連在一起。基類可能有:

[Inject] 
public var parser : IParser 

但我無法提前定義類型。林想知道是否有一個很好的方式在上下文中接線。目前我已決定通過在ResponseFactory中實例化響應來連接它,以便我在構造函數中手動通過解析器。

injector.mapValue(IParser,ModuleConfigParser,「moduleconfig」);

回答

1

我意識到,並非一切都可以在上下文中映射,RL被困我進入這種思維方式。但我意識到,它更好地映射工廠生產這些具有非常具體的依賴關係的對象,比小魚標記接口或字符串的代碼庫:)

0

一個解決方法是在你的基類中的以下內容:

​​

然後例如在ModuleConfigResponse

[Inject(name='moduleconfig')] 
public function set parser(value : IParser) : void{ 
    _parser = value; 
} 

但TBH,使用名爲注射強烈反對,你還不如用標記接口:

public interface IModuleConfigParser extends IParser{} 

基類保持不變,但M然後oduleConfigResponse將使用:

[Inject] 
public function set parser(value : IModuleConfigParser) : void{ 
    _parser = value; 
} 
+0

Mmh我得出結論與另一名開發人員命名注射是取決於環境,在情況或工廠中清楚地看到的情況並非如此糟糕。我認爲標記界面同樣糟糕。你的第一個例子可以,但是有些響應可以使用不同的解析器 - 可重用性。現在我會堅持一個封裝字符串名稱的工廠。 :)。 – serenskye 2012-03-02 14:25:31

+0

是的,他們絕對不是理想的,但他們確實有CT類型檢測的好處。但TBH我從來沒有遇到過你上面描述的情況,可能是由於不同的編碼/設計風格,所以我只是給出了一個解決問題的答案。 – Creynders 2012-03-02 16:13:19