2014-09-11 97 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