2014-04-15 47 views
2

我想用Dart構建應用程序服務器。 dart中的httpServer:io庫肯定是一個很好的起點。但是我很難與「部署」應用程序而不重新啓動服務器進程。Dart動態類加載

更確切地說:我想要像Java中的servlet容器,比如Tomcat,我可以輕鬆部署或重新部署應用程序,而無需重新啓動容器。我以爲我可以利用鏡像系統,它允許我原則上從文件系統加載一個庫及其包含的類。但不幸的是,我似乎無法重新加載庫。當我向庫中添加新類時,或者更改現有類的編碼時,如果不重新啓動飛鏢進程,該庫的新反射不會反映這些更改。只有當我停止進程並再次重新啓動時,更改纔可見。

所以:有沒有辦法擦洗鏡像系統,並讓它在相同的Dart進程中再次加載庫及其類?

回答

1

我認爲菌株非常適合這種需求。

我自己還沒有使用過它們,但據我所知,可以動態加載和卸載它們。 該文檔還不是很廣泛。 有幾件事情,我發現:

+0

太棒了!事實上,在每個新的隔離內,MirrorSystem都會重新鏡像庫。但是這帶來了性能影響。執行「Dartlet」的時間從〜0.3ms增加到〜30.0ms。所以我不會重載每個請求的庫,但只有在觸發「部署」事件的時候。 – Gregor

+0

感謝您的反饋! –

0

所以,是的,有可能在達特動態(重新)負載dart-運行時的文件。每個新的隔離器都有自己的MirrorSystem。如果要重新加載dart文件,則必須創建一個新的隔離區,並使用此隔離區的MirrorSystem來遍歷此MirrorSystem已知的庫中的內容。如果您的dart文件是MirrorSystem已知庫的一部分,則此文件中包含的所有函數和類都會加載並重新反映。

該解決方案有一些缺點:首先,它非常重量級。隔離間通信的編程很麻煩。此外,每次重新加載內存消耗是否會增加。其次,該解決方案不是真正動態的:僅隔離加載設計時「已知」的庫。它們必須直接或間接地導入到包含靜態函數的dart文件中,該靜態函數在創建隔離區時調用。

兩種想法如何改善情況: 1.如果隔離區的spawn和spawnUri方法可以獲得附加庫的列表作爲參數,它將包含在隔離區的MirrorSystem中,這將有所幫助。 2. Java中的類加載器獨立於進程和線程。他們只是加載類。爲什麼在Dart中這不可能?