基于ASP.NET Core的模块化设计: 虚拟文件系统

土牛亲自录制的本文介绍视频

Abp中文网(https://cn.abp.io/)提供翻译字幕

基于ASP.NET Core的模块化设计: 虚拟文件系统

简介

创建模块化的应用程序很困难. 构建模块化的用户界面更加困难. 需要单独开发模块的页面和组件,但是最后要把它们集成在一起像单个UI一样

创建这样的模块化架构之前需要构建一个强大的基础设施,这就是我们在开源的ABP[1]项目中尝试做的事情

在本文中我会重点介绍虚拟文件系统,它是模块化基础设施的组要组成部分,并解释我们为什么需要它,以及如何在ASP.NET CORE的基础之上开发虚拟文件系统

本文的视频演示请看这里[2]

用户界面组件

典型的ASP.NET CORE MVC Web应用程序UI由静态和动态资源组成

640?wx_fmt=png

静态资源包括JavaScript,css,image...等文件. 这些资源请求由Static Files中间件响应处理. 它们通常位于程序的wwwroot下

动态资源是Razor视图,页面和组件. 它们由Razor引擎处理,编译和呈现

静态和动态文件通常都位于物理文件系统中 (虽然最新的ASP.NET CORE有预编译选项,但要点是相同的)

模块化应用程序中的用户界面组件

在模块化应用程序中, UI组件分散到各个模块中, 通常嵌入到模块程序集中(DLL文件)中

640?wx_fmt=png

静态文件中间件和Razor视图引擎无法处理分布在模块程序集之间的资源

虚拟文件系统

虚拟文件系统是一个适配器(包装器),使ASP.NET Core可以使用物理文件系统以外的资源

640?wx_fmt=png

我们的虚拟文件系统实现可以使用三种类型的文件位置

嵌入式文件: 位于DLL中的文件作为嵌入式资源. 这些资源在应用程序启动时注册到虚拟文件系统•物理文件: 位于web应用程序下的文件(静态资源的wwwroot文件夹,视图的根文件夹,页面..等). 它是向后兼容的•动态文件: 运行时生成的文件(例如动态js/css bundle文件)

动态文件可以覆盖物理文件, 物理文件可以覆盖嵌入文件(如果位于同一路径中). 通过这种方式应用程序可以覆盖模块的UI组件(如CSS文件,JS文件或视图)以便进行自定义

虚拟文件注册

模块应该在应用程序启动时向虚拟文件系统注册/添加自己的嵌入式资源.我们已经为此创建了VirtualFileSystemOptions. 用法示例:

context.Services.Configure<VirtualFileSystemOptions>(options =>{    options        .FileSets        .AddEmbedded<MyModule>();});

上方的代码将MyModule类的程序集中的所有嵌入资源添加到虚拟文件系统(VFS)中,当所有的模块都在VFS中注册后,我们就会在内存中的字典/集合中提供一个文件列表及其路径(嵌入式命名空间转换为路径)

IFileProvider接口

ASP.NET Core使用IFileProvider接口从文件系统中读取文件:

public interface IFileProvider{    IFileInfo GetFileInfo(string subpath);    IDirectoryContents GetDirectoryContents(string subpath);    IChangeToken Watch(string filter);}

GetFileInfo方法从给定的路径读取文件信息和内容. 如果给定文件不存在,则返回NotFoundFileInfoGetDirectoryContents方法用于获取目录中的文件和目录列表. 如果给定的目录不存在会返回NotFoundDirectoryContents (可以返回单例实例:NotFoundDirectoryContents.Singleton)•Watch方法用于在给定路径中文件或文件夹发生更改时收到通知. 过滤器可以包含通配符(如'*')

很显然我们应该实现这个接口从嵌入式/动态文件中返回文件,不过我不会在本文中分享实现部分,如果你想了解详细信息,请参阅我们的实现[3]文档[4]

配置Razor视图引擎

当我们实现了虚拟文件系统,我们就可以配置RazorViewEngineOptions来添加新的自定义文件提供程序:

context.Services.Configure<RazorViewEngineOptions>(options =>{    options.FileProviders.Insert(0, new MyVirtualFileProvider());});

替换静态文件中间件

通常我们使用app.UseStaticFiles向浏览器提供物理文件,不过要使用虚拟文件系统,我们需要替换它. 这部分也很简单. 我们可以编写这个一个扩展方法:

public static void UseVirtualFiles(this IApplicationBuilder app){    app.UseStaticFiles(        new StaticFileOptions        {            FileProvider = new MyVirtualFileProvider()        }    );}

MyVirtualFileProvider是我们示例的IFileProvider实现. 你可以将FileProvider设置为任何IFileProvider接口的实现类

最后我们使用UseVirtualFiles方法替换UseVirtualFiles:

app.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/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316517.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[学习笔记] 乱世之神杀疯了 —— K-D tree

文章目录K-D tree建树合并插入删除查询(估价函数)旋转坐标系题目练习[SDOI2012]最近最远点对[Violet]天使玩偶/SJY摆棋子[CQOI2016]K远点对[国家集训队]JZPFARThe closest M points简单题巧克力王国[BOI2007]Mokia 摩基亚[CH弱省胡策R2]TATT[BZOJ3815]卡常数[NOI2019]弹跳A sim…

【春华秋实】.NET Core之只是多看了你一眼

技术学习是一件系统性的事情&#xff0c;如果拒绝学习&#xff0c;那么自己就会落后以至于被替代。.NET也是一样&#xff0c;当开源、跨平台成为主流的时候&#xff0c;如果再故步自封&#xff0c;等待.NET的就是死路一条&#xff0c;幸好.NET Core问世了&#xff0c;社区反响积…

[SDOI2010]粟粟的书架

[SDOI2010]粟粟的书架 题意&#xff1a; 一个R * C的矩阵&#xff0c;每个位置都有个数page[ij]&#xff0c;现在选定一个小矩阵范围(给左上角坐标&#xff0c;和右下角坐标)&#xff0c;问这个范围内的数总和是否大于h&#xff0c;如果大于h的话最少选几个数aij 对于50%的数…

基于Asp.Net Core的简单社区项目源代码开源

2019年3月27号 更新版本 本项目基于 ASP.NET CORE 3.0EF CORE 3.0开发使用vs2019 sqlserver 2017(数据库脚本最低支持sql server 2012/)使用步骤:1.下载相关开发工具2.运行数据库脚本目录下的相关脚本3.默认前端账号密码: 18812345678 1234564.默认后台账号密码: admin 123456开…

[学习笔记] 如果你愿意学那么你是可以看的懂的 —— 群论与 burnside 引理和 polya 定理

群与子群 <G,op><G,op><G,op> 是一个群需要满足以下条件&#xff1a; opopop 是一个满足结合律的二元运算&#xff0c;如 *&#xff0c;。GGG 是一个集合&#xff0c;存在单位元 eee。GGG 中所有元素都有逆元。即 GGG 对 opopop 运算封闭&#xff0c;封闭简单…

为什么从前那些.NET开发者都不写单元测试呢?

楔子四年前我虽然也写了很多年代码&#xff0c;由于公司虽然规模不小&#xff0c;却并非一家规范化的软件公司&#xff0c;因此在项目中严格意义上来说并没有架构设计、也不写单元测试&#xff0c;后来有幸加入了一家公司&#xff0c;这家公司虽然也是一家小公司&#xff0c;但…

使用 xUnit 编写 ASP.NET Core 单元测试

还记得 .NET Framework 的 ASP.NET WebForm 吗&#xff1f;那个年代如果要在 Web 层做单元测试简直就是灾难啊。.NET Core 吸取教训&#xff0c;在设计上考虑到了可测试性&#xff0c;就连 ASP.NET Core 这种 Web 或 API 应用要做单元测试也是很方便的。其中面向接口和依赖注入…

记录使用 Cake 进行构建并制作 nuget 包

前段时间折腾了一下&#xff0c;总算是把我自己的图片缓存控件&#xff08;https://github.com/h82258652/HN.Controls.ImageEx&#xff09;发布到了 nuget 上&#xff0c;目前已经进入一个比较稳定的版本了&#xff0c;基本没有很严重的 bug 了。其实核心代码早就写完了&#…

DDD领域驱动设计理论篇 - 学习笔记

一、Why DDD?在加入X公司后&#xff0c;开始了ASP.NET CoreDockerLinux的技术实践&#xff0c;也开始了微服务架构的实践。在微服务的学习中&#xff0c;有一本微软官方出品的《.NET微服务&#xff1a;容器化.NET应用架构指南》是我们学习的葵花宝典&#xff0c;纵观微软官方放…

.NetCore使用skywalking实现实时性能监控

一、简介很久之前写了一篇 《.Net Core 2.0 InfluxDBGrafanaApp Metrics 实现跨平台的实时性能监控》关于NetCore性能监控的文章&#xff0c;使用InfluxdbAppMetrics进行项目性能监控&#xff0c;由于技术有限&#xff0c;在正式环境使用一段时间后&#xff0c;莫名的AppMetric…

netcore开发windows普通服务(非Web)并一键发布到服务器

netcore下开发windows服务如果是web项目的话&#xff0c;由于aspnetcore本身是支持的&#xff0c;把默认的host.Run改为host.RunAsService就可以了。但是普通的netcore的控制台项目我终于找到了如下方式来实现&#xff1a;Microsoft.Extensions.HostingSystem.ServiceProcess.S…

Hopping Rabbit

Hopping Rabbit 题意&#xff1a; 给你n个矩阵&#xff0c;每个矩阵(给出左上标和右下标)&#xff0c;现在让你给出一个点的位置&#xff0c;这个点每次只能上下左右四个方向移动&#xff0c;且移动距离为d&#xff0c;是否存在一个这样的点&#xff0c;其所有落点都不在矩阵…

直播预告 - 微软MVP为你揭秘Visual Studio 2019新特性

作为"宇宙第一IDE“的Visual Studio集成开发环境&#xff0c;已经经历了超过十几年的迭代成为一款功能丰富且高效的开发工具&#xff0c;微软自己给Visual Studio 的定位是 “更快、更可靠&#xff0c;对个人和团队更具生产力&#xff0c;更易于使用&#xff0c;并且更容易…

.NET 机器学习生态调查

机器学习是一种允许计算机使用现有数据预测未来行为、结果和趋势的数据科学方法。 使用机器学习&#xff0c;计算机可以在未显式编程的情况下进行学习。机器学习的预测可以使得应用和设备更智能。 在线购物时&#xff0c;机器学习基于历史购买推荐你可能喜欢的其他产品。 刷信用…

图中异色点对最短距离(最小生成树+线段树)

problem 给定一个 nnn 个点&#xff0c;mmm 条边的无向连通图&#xff0c;图有边权&#xff0c;每个点有一个颜色。 有 qqq 次操作&#xff0c;每次操作可更改某一个点颜色。 求每次操作后图中不同颜色点之间的最短距离。 若图中点颜色全相同&#xff0c;输出 000。 一行给…

Defend Your Country

Defend Your Country 题意&#xff1a; n个点&#xff0c;m条边的简单无向连通图&#xff0c;每个点一个权值ai,一个连通块的贡献&#xff1a;(−1)块内点数∗∑ai[点i在该连通块内](-1)^{块内点数}*\sum a_{i}[点i在该连通块内](−1)块内点数∗∑ai​[点i在该连通块内] 可以…

SkyWalking Liunx 环境搭建NetCore接入

背景前两天看见有小哥介绍windows下安装skywalking的介绍地址。正好最近也在搭建linux环境的SkyWalking&#xff0c;顺便把linux环境搭建的经验分享下&#xff0c;帮助下使用linux部署DotNetCore项目的同学。介绍SkyWalking是开源的apm工具&#xff0c;服务器端使用java编写&am…

.NET 基金会完成第一次全面改选

.NET基金会是一个独立的组织&#xff0c;支持.NET社区和开源&#xff0c;旨在拓宽和加强.NET生态系统和社区。这可以通过多种方式完成&#xff0c;包括项目指导&#xff0c;指导&#xff0c;法律和营销帮助&#xff0c;技术和财务支持设置等&#xff0c;2014年微软组织成立.NET…

xay loves trees

xay loves trees 题意&#xff1a; 有两棵树&#xff0c;现在让你找到一个最大的点集合S&#xff0c;要求S中的点在第一棵树中任意两点存在祖先儿子关系且所有点是连接的&#xff0c;在第二棵树中任意两点都不存在祖先儿子关系&#xff0c;问S集合的最大是多少&#xff1f; …

特来电混沌工程实践

一、导语随着大型分布式系统架构的演进和广泛应用&#xff0c;软件工程的最佳实践也随之改变。我们通过分布式、服务化、DevOps、敏捷开发&#xff0c;快速响应业务的需求变化&#xff0c;支持大规模分布式应用。但这些做法带来效益的同时&#xff0c;也带来了另一个紧迫问题&a…