【愚公系列】2022年03月 .NET架构班 020-ABP vNext 虚拟文件系统

举报
愚公搬代码 发表于 2022/03/11 03:19:14 2022/03/11
【摘要】 前言虚拟文件系统可以管理文件系统(磁盘)上实际不存在的文件。 它主要用于将(js,css,image,cshtml …)文件嵌入到程序集中,并在运行时将它们用作物理文件。 一、集成虚拟文件系统1、先在EBusiness.Application项目中通过Nuget下载Volo.Abp.VirtualFileSystem2、然后在EBusinessApplicationModule文件上增加(...

前言

虚拟文件系统可以管理文件系统(磁盘)上实际不存在的文件。 它主要用于将(js,css,image,cshtml …)文件嵌入到程序集中,并在运行时将它们用作物理文件。

一、集成虚拟文件系统

1、先在EBusiness.Application项目中通过Nuget下载

Volo.Abp.VirtualFileSystem

2、然后在EBusinessApplicationModule文件上增加(默认不需要加载,因为其他模块已经集成)

[DependsOn(typeof(AbpVirtualFileSystemModule))]
 public class EBusinessApplicationModule: AbpModule
 {}

3、然后在EBusiness.Application项目中EBusinessApplicationModule类中添加

// 虚拟文件系统
public class EBusinessApplicationModule : AbpModule
{
  public override void ConfigureServices(ServiceConfigurationContext context)
  {
    ....
    Configure<AbpVirtualFileSystemOptions>(options =>
    {
        options.FileSets.AddEmbedded<EBusinessApplicationModule>( // 那个项目中的文件
        baseNamespace: "EBusiness.Application" // 默认命名空间
    );
    });
    ....
   }
}

4、最后使用EBusiness.Application项目中WxPayAppService类中使用IVirtualFileProvider接口获取指定文件

public class WxPayAppService : EBusinessAppService, IPayAppService
{ 
        ....
        
        public IVirtualFileProvider _virtualFileProvider { set; get; }
        ....
        public string CreatePay(string productName, string orderSn, string totalPrice)
        {
            .....
            var file = _virtualFileProvider.GetFileInfo("/Pays/certs/apiclient_cert.p12");
            
            NativePay nativePay = new NativePay();
                nativePay.description = productName;
                nativePay.out_trade_no = orderSn;
                nativePay.amount.total = int.Parse(float.Parse(totalPrice) * 100 + "");

                // 2、支付对象转换成json
                string nativePayJson = JsonConvert.SerializeObject(nativePay);

                // 3、创建支付
                string result = _wxPayHttpClient.
                    WeChatPostAsync(nativeUrl,
                    nativePayJson,
                    file.PhysicalPath,
                    mchid,
                   certSerialNo).Result;
                return result;
        }
 }

5、AddEmbedded 配置参赛
AddEmbedded 扩展方法需要一个类, 从给定类的程序集中查找所有嵌入文件, 并将它们注册到虚拟文件系统. 通常将模块类作为通用参数传递.

AddEmbedded 有两个可选参数;

  • baseNamespace: 仅在你没有配置上面说明的GenerateEmbeddedFilesManifest并且你的根名称空间不为空时,才可能需要这样做. 在这种情况下,请在此处设置你的根名称空间.
  • baseFolder:如果你不想公开项目中的所有嵌入式文件,只希望公开特定的文件夹(和子文件夹/文件),可以相对于项目根页面设置基本文件夹.
Configure<AbpVirtualFileSystemOptions>(options =>
{
    options.FileSets.AddEmbedded<MyModule>(
        baseNamespace: "Acme.BookStore.MyFiles",
        baseFolder: "/MyFiles"
    );
});

这个例子假设;

  • 你的项目根(default)命令空间是 Acme.BookStore.
  • 你的项目有一个名为 MyFiles 的目录.
  • 你只想添加 MyFiles 目录到虚拟文件系统.

二、WEB项目使用虚拟文件系统

1、先在EBusiness.Web项目中通过Nuget下载

Volo.Abp.VirtualFileSystem

2、然后在EBusinessWebnModule文件上增加(默认不需要加载,因为其他模块已经集成)

[DependsOn(typeof(AbpVirtualFileSystemModule))]
 public class EBusinessWebModule: AbpModule
 {}

3、然后在EBusiness.Web项目中EBusinessWebModule类中添加

// 虚拟文件系统
public class EBusinessWebModule : AbpModule
{
  public override void ConfigureServices(ServiceConfigurationContext context)
  {
    ....
    Configure<AbpVirtualFileSystemOptions>(options =>
    {
        options.FileSets.AddEmbedded<EBusinessWebModule>( // 那个项目中的文件
        baseNamespace: "EBusiness.Web" // 默认命名空间
    );
    });
    ....
   }
}

三、虚拟文件替换功能

1、EBusiness.Web项目中EBusinessWebModule类中添加

// 虚拟文件系统
public class EBusinessWebModule : AbpModule
{
  public override void ConfigureServices(ServiceConfigurationContext context)
  {
    ....
    Configure<AbpVirtualFileSystemOptions>(options =>
    {
        options.FileSets.ReplaceEmbeddedByPhysical<EBusinessDomainSharedModule>(Path.Combine(hostingEnvironment.ContentRootPath, $"..{Path.DirectorySeparatorChar}EBusiness.Domain.Shared"));
        options.FileSets.ReplaceEmbeddedByPhysical<EBusinessDomainModule>(Path.Combine(hostingEnvironment.ContentRootPath, $"..{Path.DirectorySeparatorChar}EBusiness.Domain"));
        options.FileSets.ReplaceEmbeddedByPhysical<EBusinessApplicationContractsModule>(Path.Combine(hostingEnvironment.ContentRootPath, $"..{Path.DirectorySeparatorChar}EBusiness.Application.Contracts"));
        options.FileSets.ReplaceEmbeddedByPhysical<EBusinessApplicationModule>(Path.Combine(hostingEnvironment.ContentRootPath, $"..{Path.DirectorySeparatorChar}EBusiness.Application"));
        options.FileSets.ReplaceEmbeddedByPhysical<EBusinessWebModule>(hostingEnvironment.ContentRootPath);
    );
    });
    ....
   }
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。