热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:VirtualFileSystem

物理的文件有wwwroot下文件(JSCSShtml居多),DLL嵌入的资源(json文件居多),Ra

物理的文件有wwwroot下文件(JSCSShtml居多),DLL嵌入的资源(json文件居多),Razor文件,

如何操作这些文件呢,首先先表示这个文件抽象(IFileInfo )

IFileInfo 表示给定文件提供程序中的某个文件。它是文件一个抽象(名称、物理路径,是否存在,IsDirectory:如果 TryGetDirectoryContents 枚举了子目录,则为 True。 ,返回只读流文件string,bytes),

其次,提供文件的操作,IFileProvider,得到目录内容(IFileInfo列表,如果有),得到文件IFileInfo,以及监视

针对以上文件,提供有physicalFileProvider(磁盘)、EmbeddedFileProvider(程序集中)、CompositeFileProvider(IFileProvider 的集合)

针对这些ABP创建了IVirtualFileProvider,它还是基于CompositeFileProvider进行IFileProvider遍历,因此存在优先级。Dymanic>physical?Embedded

下面创建CompositeFileProvider,它由下面组成

dynamicFileProvider:自创建的文件,基于InMemoryFileInfo

PhysicalFileProvider:物理文件,由配置文件AbpVirtualFileSystemOptions导入,如果PhysicalPath存在

InternalVirtualFileProvider:嵌入的文件,基于DictionaryBasedFileProvider,由配置文件AbpVirtualFileSystemOptions导入

protected virtual IFileProvider CreateHybridProvider(IDynamicFileProvider dynamicFileProvider)
{
var fileProviders = new List();
fileProviders.Add(dynamicFileProvider);
if (_options.FileSets.PhysicalPaths.Any())
{
fileProviders.AddRange(
_options.FileSets.PhysicalPaths
.Select(rootPath
=> new PhysicalFileProvider(rootPath))
.Reverse()
);
}
fileProviders.Add(
new InternalVirtualFileProvider(_options));
return new CompositeFileProvider(fileProviders);
}

回到配置文件AbpVirtualFileSystemOptions的FileSets列表,其使用的拓展方法有

AddEmbedded:引入Assembly,注意baseNamespace

list.Add(
new EmbeddedFileSet(
typeof(T).Assembly,
baseNamespace,
baseFolderInProject
)
);

 ReplaceEmbeddedByPhysical:

我们需要的是应用程序在开发时直接使用物理文件的能力, 让浏览器刷新时同步Javascript文件的任何更改. ReplaceEmbeddedByPhysical 方法使其成为可能.

 分析基于IFileProvider的IVirtualFileProvider实现方法,它的基类型是DictionaryBasedFileProvider,它实现基于IDictionary Files

它在Options的Add方法EmbeddedFileSet,调用AddFiles方法,它去除BaseNamespace,目的是填充了IDictionary字典

foreach (var resourcePath in Assembly.GetManifestResourceNames())
{

if (!BaseNamespace.IsNullOrEmpty() && !resourcePath.StartsWith(BaseNamespace))
{
continue;
}
//上面BaseNamespace不为空或与BaseNamespace开头任一条件都执行以下
//去掉BaseNamespace.开始部分,split(‘.‘)成数组,后两项是文件名,前面是文件夹,join起来成完全的路径
var fullPath = ConvertToRelativePath(resourcePath).EnsureStartsWith(/);
//如果包括/,说明有目录,则添加目录VirtualDirectoryFileInfo,然后递归,逐层去掉/,直到没有/
if (fullPath.Contains("/"))
{
AddDirectoriesRecursively(files, fullPath.Substring(
0, fullPath.LastIndexOf(/)), lastModificationTime);
}
//添加文件EmbeddedResourceFileInfo
files[fullPath] = new EmbeddedResourceFileInfo(
Assembly,
resourcePath,
fullPath,
CalculateFileName(fullPath),
lastModificationTime
);
}

GetFileInfo方法,输入不能为空的,则根据字典GetOrDefault(路径),它可以得到文件EmbeddedResourceFileInfo,也可以得到VirtualDirectoryFileInfo

GetDirectoryContents,它是基于GetFileInfo得到,输入也不能为空的,如果到是文件名,则直接返回没有找到目录,否则遍历字典的File,它去除输入目录,

找到路径不包含/,注意它可能是文件名,也可能是目录

foreach (var fileInfo in Files.Values)
{
var fullPath = fileInfo.GetVirtualOrPhysicalPathOrNull();
if (!fullPath.StartsWith(directoryPath))
{
continue;
}
var relativePath = fullPath.Substring(directoryPath.Length);
if (relativePath.Contains("/"))
{
continue;
}
fileList.Add(fileInfo);
}

WebContentFileProvider实现

它是PhysicalFileProvider,以及_virtualFileProvider的复合FileProvider

protected virtual IFileProvider CreateFileProvider()
{
return new CompositeFileProvider(
new PhysicalFileProvider(_hostingEnvironment.ContentRootPath),
_virtualFileProvider
);
}

1)GetFileInfo方法,要求以/Pages、/Views、/Themes开始,并且,拓展名以.js,.css,.png。.jpg,.jpeg结束等文件

   否则要加上/wwwroot

2) 同理是GetDirectoryContents,以以/Pages、/Views、/Themes开始

1、静态资源,使用MiddleWare

public static IApplicationBuilder UseVirtualFiles(this IApplicationBuilder app)
{
return app.UseStaticFiles(
new StaticFileOptions
{
FileProvider
= app.ApplicationServices.GetRequiredService()
}
);
}

 

2、RazorEngine

//Configure Razor
context.Services.Insert(0,
ServiceDescriptor.Singleton
>(
new ConfigureOptions(optiOns=>
{
options.FileProviders.Add(
new RazorViewEngineVirtualFileProvider(
context.Services.GetSingletonInstance
>()
)
);
}
)
)
);

 

模块内添加嵌入式资源

1、AbpLocalizationModule下面有AbpValidation
2、

Configure(optiOns=>
{
options.FileSets.AddEmbedded
<AbpAspNetCoreMvcUiBootstrapModule>("Volo.Abp.AspNetCore.Mvc.UI.Bootstrap");
});
Configure
(optiOns=>
{
options.FileSets.AddEmbedded
<AbpAspNetCoreMvcUiMultiTenancyModule>();
});
Configure
(optiOns=>
{
options.FileSets.AddEmbedded
<AbpAspNetCoreMvcUiBasicThemeModule>("Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic");
});
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure
(optiOns=>
{
options.FileSets.AddEmbedded
<AbpEmailingModule>();
});

}
Configure
(optiOns=>
{
options.FileSets.AddEmbedded
<AbpAspNetCoreMvcUiWidgetsModule>();
});
Configure
(optiOns=>
{
options.FileSets.AddEmbedded
<AbpLocalizationModule>("Volo.Abp", "Volo/Abp");
});
Configure
(optiOns=>
{
options.FileSets.AddEmbedded
<AbpUiNavigationModule>();
});
Configure
(optiOns=>
{
options.FileSets.AddEmbedded
<AbpUiNavigationModule>();
});
Configure
(optiOns=>
{
options.FileSets.AddEmbedded
<AbpUiModule>();
});

 

 

 

 

 

 


推荐阅读
  • 近期在研究Java IO流技术时,遇到了一个关于如何正确读取Doc文档而不出现乱码的问题。本文将详细介绍使用Apache POI库处理Doc和Docx文件的具体方法,包括必要的库引入和示例代码。 ... [详细]
  • 本文详细介绍了Oracle RMAN中的增量备份机制,重点解析了差异增量和累积增量备份的概念及其在不同Oracle版本中的实现。通过对比两种备份方式的特点,帮助读者选择合适的备份策略。 ... [详细]
  • 本文介绍了一个基本的同步Socket程序,演示了如何实现客户端与服务器之间的简单消息传递。此外,文章还概述了Socket的基本工作流程,并计划在未来探讨同步与异步Socket的区别。 ... [详细]
  • 本文介绍了如何使用C# Winform开发局域网内的文件传输功能,详细描述了从用户界面到后端网络通信的具体实现。 ... [详细]
  • 本文探讨了Java中有效停止线程的多种方法,包括使用标志位、中断机制及处理阻塞I/O操作等,旨在帮助开发者避免使用已废弃的危险方法,确保线程安全和程序稳定性。 ... [详细]
  • 构建Python自助式数据查询系统
    在现代数据密集型环境中,业务团队频繁需要从数据库中提取特定信息。为了提高效率并减少IT部门的工作负担,本文探讨了一种利用Python语言实现的自助数据查询工具的设计与实现。 ... [详细]
  • 本文详细介绍了如何在本地环境中安装配置Frida及其服务器组件,以及如何通过Frida进行基本的应用程序动态分析,包括获取应用版本和加载的类信息。 ... [详细]
  • 本文介绍了两个重要的Node.js库——cache-content-type和mime-types,它们在处理HTTP响应头时非常有用。cache-content-type是基于mime-types构建的,并且实现了缓存机制以提高性能。 ... [详细]
  • 第1章选择流程控制语句1.1顺序结构的基本使用1.1.1顺序结构概述是程序中最简单最基本的流程控制,没有特定的语法结构,按照代码的先后顺序,依次执行,程序中大多数的代码都是这样执行 ... [详细]
  • 本文介绍了一个将 Java 实体对象转换为 Map 的工具类,通过反射机制获取实体类的字段并将其值映射到 Map 中,适用于需要将对象数据结构化处理的场景。 ... [详细]
  • ED Tree HDU4812 点分治+逆元
    这道题非常巧妙!!!我们进行点分治的时候,算出当前子节点的所有子树中的节点,到当前节点节点的儿子节点的距离,如下图意思就是当前节点的红色节点,我们要求出红色节点的儿子节点绿色节点, ... [详细]
  • 今天老师上课讲解的很好,特意记录下来便于以后复习。多态的简单理解*1.什么是多态性?*(1)同一个动作与不同的对象产生不同的行为*(2)多态指的 ... [详细]
  • A1166 峰会区域安排问题(25分)PAT甲级 C++满分解析【图论】
    峰会是指国家元首或政府首脑之间的会议。合理安排峰会的休息区是一项复杂的工作,理想的情况是邀请的每位领导人都是彼此的直接朋友。 ... [详细]
  • 本文介绍了进程的基本概念及其在操作系统中的重要性,探讨了进程与程序的区别,以及如何通过多进程实现并发和并行。文章还详细讲解了Python中的multiprocessing模块,包括Process类的使用方法、进程间的同步与异步调用、阻塞与非阻塞操作,并通过实例演示了进程池的应用。 ... [详细]
  • 本文介绍了如何利用Java编程语言中的正则表达式来验证字符串中的数字是否符合中国三大运营商(中国电信、中国联通、中国移动)的手机号码格式。文章提供了详细的代码示例和解析。 ... [详细]
author-avatar
性感的aaaaaaaaa_681
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有