ASP.NET vNext允許你自定義項目加載器以及對多種語言的支持
英文原文:ASP.NET vNext: Custom Project Loaders and Language Support
ASP.NET vNext 運行時會在實際運行 C# 源代碼之前使用 Rosylyn 編譯器對代碼進行編譯并加載。David Fowler 為大家演示了如何使用 KRuntime 加載程序的依賴注入功能,讓你選擇的編程語言也可以支持 vNext。
KRuntime 加載程序包含了創建并運行 ASP.NET vNext 應用程序所需要的全部功能,出于設計原則的考慮,運行時本身無法分辨何謂“設計時”這一概念,編輯與加載操作是同時發生的。由于這一原因,KRuntime 定義了多個獨有的加載器,它們會從 project.json 文件中讀取全部依賴項,隨后與項目本身的源代碼一起進行構建。
項目引用(project reference)加載器的行為十分有趣,在默認情況下,它會調用 RosylynProjectReferenceProvider,后者會返回一個 RosylynProjectReference 對象。正如其名稱所顯示的一樣,它會使用 Rosylyn C#編譯器對 C# 源代碼進行編譯并加載程序集。
不過這一行為是可以被覆蓋的,David Fowler 演示了相應的做法。
ASP.NET vNext 中對F#的支持
讓我們來看一下 David 在 github 上所創建的 vNextLanguageSupport 項目,他在項目中定義了一個 FSharpProjectReferenceProvider 類,實現了 IProjectReferenceProvider 接口。該類中的方法會返回一個 FSharpProjectReference 對象,后者則實現了 IMetadataProjectReference 接口。
FSharpProjectReference 在 Emit 方法中進行了一系列的操作:
- 遍歷項目引用
- 將全部引用拷貝到某個臨時文件夾中
- 使用 fsc 編譯器對源代碼文件,以及這些引用進行編譯
- 刪除臨時文件 </ul>
這兩個類都可以在 FSharpSupport 項目中找到,因此可以將其編譯后作為一個程序集進行引用。值得一提的是,雖然這兩個類的實現是為了支持F#,但它們自身是用 C# 語言編寫的。
David 隨后在一個F#項目示例中使用了這兩個類,為此他特意在 project.json 文件中定義了 projectReferenceProviderType 屬性。
"language": { "name": "F#", "assembly": "FSharpSupport", "projectReferenceProviderType": "FSharpSupport.FSharpProjectReferenceProvider" },
這樣,你的 ASP.NET vNext 應用就能夠支持F#了。項目的啟動類現在是一個F#類型,而不是 C# 類了。
雖然這個示例中只用到了F#,但你可以使用相同技術讓任何 CLR 語言都為 ASP.NET vNext 所支持,所需的只是為 IMetadataProjectReference 和 IProjectReferenceProvider 接口提供你自己的實現。
Aleksander Heintz 也在多篇文章中針對 David 的示例進一步進行了詳細解釋:
項目加載器是如何運行的(請注意:這篇文章有些內容過時了,比方說 RosylynAssemblyLoader 這個類現在已經不存在了)。
關于 FSharpReferenceProvider 的更多細節。
如何使用上述以 C# 代碼實現的 FSharpReferenceProvider 類,讓它加載一個真正的F#實現(并使用該F#實現以加載F#源代碼)!
這個示例本身并不復雜,但它為我們演示了 KRuntime 所使用的內置依賴注入的強大功能,它為你在項目中加入新特性提供了許多靈活性。正如在 KRuntime 結構一 文中所說明的一樣,運行時的每一個層,包括原生進程層(Native Process)、寄宿層(Host)、托管入口點層(Managed Entry Point)以及應用程序寄宿層(Application Host),都是由依賴注入方式所解析的。(作為示例,KRuntime 能夠通過 Mono 運行在 Linux 和 OSX 操作系統上)。
ASP.NET vNext 代表了微軟在 web 框架的構建及部署方面一次結構性的改變。
<span id="shareA4" class="fl">
</span>