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

【摘要】 前言虚拟文件系统可以管理文件系统(磁盘)上实际不存在的文件。 它主要用于将(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进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
 
转 https://bbs.huaweicloud.com/blogs/336576
posted @   dreamw  阅读(75)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示