2014-09-11 76 views
5

首先,我正在做的事情的上下文。我正在運行一個處理HttpRequests的HttpServer。將屬性添加到對象(或至少類似的結果)

HttpServer.bind(ADDRESS, PORT).then((HttpServer server) { 
     listenSubscription = server.listen(onRequest); 
    }); 

    void onRequest(HttpRequest request) { 
     //handle request here 
    } 

我想一些記錄添加到這一切,因爲這一切的異步性,希望將一些識別標識添加到請求(這樣我就可以匹配與請求收據答案,例如)。 onRequest()裏面的代碼調用了一堆其他函數來處理不同的事情(處理GET和POST請求等),所以只需在頂部生成一個id是一個麻煩的解決方案,因爲我必須通過所有這些其他函數調用。不過,我已經在傳遞HttpRequest這個對象了,所以我認爲在它上面拋出一個id字段會很好,就像在JavaScript中一樣,除了Dart不能這樣工作。

想法然後去繼承HttpRequest類的子類,但將HttpRequest對象轉換爲onRequest()方法似乎比我需要的更麻煩和更多的開銷。

所以我問,有沒有任何慣用的飛鏢方式附加一些數據到現有的對象?如果沒有一些慣用的東西,那麼你可以想到的最簡單的方法(無論是在代碼和運行時複雜度方面)是什麼?

+0

您可以使用對象作爲附加數據的鍵和值來創建映射。不漂亮,但很簡單。 – JAre 2014-09-11 02:42:33

+0

地圖是我曾經考慮過的,但需要手動清理垃圾,這讓我想找到更好的東西。看起來'Expando'(看到接受的答案)或多或少是一樣的東西,但是自動清理並且包裝在一個漂亮的包中。 – 2014-09-11 06:25:01

回答

5

那麼,有一個Expando,但我不知道性能影響。

喜歡的東西:

// somewhere top level. Create this once. 
final loggingId = new Expando(); 
... 
// inside of onRequest 
loggingId[request] = generateId(); 
... 
// later inside log() 
print(loggingId[request]); 

expandos將像弱的參考圖,從我的理解。

+0

這很好。謝謝你將這堂課指給我塞思,我不知道它存在。我最終添加了兩個Expandos到服務器,一個用於跟蹤請求ID,另一個用於附加「Stopwatch」,這樣我也可以記錄響應時間。 – 2014-09-11 06:28:07