基于ASP.NET Core的模块化设计: 虚拟文件系统
土牛親自錄制的本文介紹視頻
Abp中文網(https://cn.abp.io/)提供翻譯字幕
基于ASP.NET Core的模塊化設計: 虛擬文件系統
簡介
創建模塊化的應用程序很困難.?構建模塊化的用戶界面更加困難. 需要單獨開發模塊的頁面和組件,但是最后要把它們集成在一起像單個UI一樣
創建這樣的模塊化架構之前需要構建一個強大的基礎設施,這就是我們在開源的ABP[1]項目中嘗試做的事情
在本文中我會重點介紹虛擬文件系統,它是模塊化基礎設施的組要組成部分,并解釋我們為什么需要它,以及如何在ASP.NET CORE的基礎之上開發虛擬文件系統
本文的視頻演示請看這里[2]
用戶界面組件
典型的ASP.NET CORE MVC Web應用程序UI由靜態和動態資源組成
靜態資源包括JavaScript,css,image...等文件. 這些資源請求由Static Files中間件響應處理. 它們通常位于程序的wwwroot下
動態資源是Razor視圖,頁面和組件. 它們由Razor引擎處理,編譯和呈現
靜態和動態文件通常都位于物理文件系統中?(雖然最新的ASP.NET CORE有預編譯選項,但要點是相同的)
模塊化應用程序中的用戶界面組件
在模塊化應用程序中, UI組件分散到各個模塊中, 通常嵌入到模塊程序集中(DLL文件)中
靜態文件中間件和Razor視圖引擎無法處理分布在模塊程序集之間的資源
虛擬文件系統
虛擬文件系統是一個適配器(包裝器),使ASP.NET Core可以使用物理文件系統以外的資源
我們的虛擬文件系統實現可以使用三種類型的文件位置
?嵌入式文件: 位于DLL中的文件作為嵌入式資源. 這些資源在應用程序啟動時注冊到虛擬文件系統?物理文件: 位于web應用程序下的文件(靜態資源的wwwroot文件夾,視圖的根文件夾,頁面..等). 它是向后兼容的?動態文件: 運行時生成的文件(例如動態js/css bundle文件)
動態文件可以覆蓋物理文件, 物理文件可以覆蓋嵌入文件(如果位于同一路徑中). 通過這種方式應用程序可以覆蓋模塊的UI組件(如CSS文件,JS文件或視圖)以便進行自定義
虛擬文件注冊
模塊應該在應用程序啟動時向虛擬文件系統注冊/添加自己的嵌入式資源.我們已經為此創建了VirtualFileSystemOptions. 用法示例:
上方的代碼將MyModule類的程序集中的所有嵌入資源添加到虛擬文件系統(VFS)中,當所有的模塊都在VFS中注冊后,我們就會在內存中的字典/集合中提供一個文件列表及其路徑(嵌入式命名空間轉換為路徑)
IFileProvider接口
ASP.NET Core使用IFileProvider接口從文件系統中讀取文件:
?GetFileInfo方法從給定的路徑讀取文件信息和內容. 如果給定文件不存在,則返回NotFoundFileInfo?GetDirectoryContents方法用于獲取目錄中的文件和目錄列表. 如果給定的目錄不存在會返回NotFoundDirectoryContents?(可以返回單例實例:NotFoundDirectoryContents.Singleton)?Watch方法用于在給定路徑中文件或文件夾發生更改時收到通知. 過濾器可以包含通配符(如'*')
很顯然我們應該實現這個接口從嵌入式/動態文件中返回文件,不過我不會在本文中分享實現部分,如果你想了解詳細信息,請參閱我們的實現[3]和文檔[4]
配置Razor視圖引擎
當我們實現了虛擬文件系統,我們就可以配置RazorViewEngineOptions來添加新的自定義文件提供程序:
替換靜態文件中間件
通常我們使用app.UseStaticFiles向瀏覽器提供物理文件,不過要使用虛擬文件系統,我們需要替換它. 這部分也很簡單. 我們可以編寫這個一個擴展方法:
MyVirtualFileProvider是我們示例的IFileProvider實現. 你可以將FileProvider設置為任何IFileProvider接口的實現類
最后我們使用UseVirtualFiles方法替換UseVirtualFiles:
寫在最后
我試圖簡單的描述為什么開發模塊化的ASP.NET Core Mvc應用程序會需要虛擬文件系統以及如何實現它
我計劃根據我的ABP框架[5]開發經驗,在ASP.NET Core上發布更多模塊化應用程序開發的文章
References
[1]?ABP:?https://cn.abp.io
[2]?這里:?https://www.bilibili.com/video/av47031992?from=search&seid=6709357480596566187
[3]?實現:?https://github.com/abpframework/abp/tree/master/framework/src/Volo.Abp.VirtualFileSystem
[4]?文檔:?https://cn.abp.io/documents/abp/latest/Virtual-File-System
[5]?ABP框架:?https://cn.abp.io/
總結
以上是生活随笔為你收集整理的基于ASP.NET Core的模块化设计: 虚拟文件系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分布式系统的构建原则
- 下一篇: 一文带你全面认识Excel催化剂系列功能