[Abp vNext 源码分析] - 23. 二进制大对象系统(BLOB) (4)

文件系统作为 BLOB 的最简化实现,本质就是通过文件夹进行租户隔离动作,所有操作都会将数据持久化到硬盘上。核心代码就一个文件 FileSystemBlobProvider,在这个文件内部定义了具体的执行逻辑,我们这里大概看一下 SaveAsyn() 的实现。

public override async Task SaveAsync(BlobProviderSaveArgs args) { var filePath = FilePathCalculator.Calculate(args); if (!args.OverrideExisting && await ExistsAsync(filePath)) { throw new BlobAlreadyExistsException($"Saving BLOB '{args.BlobName}' does already exists in the container '{args.ContainerName}'! Set {nameof(args.OverrideExisting)} if it should be overwritten."); } DirectoryHelper.CreateIfNotExists(Path.GetDirectoryName(filePath)); var fileMode = args.OverrideExisting ? FileMode.Create : FileMode.CreateNew; await Policy.Handle<IOException>() .WaitAndRetryAsync(2, retryCount => TimeSpan.FromSeconds(retryCount)) .ExecuteAsync(async () => { using (var fileStream = File.Open(filePath, fileMode, FileAccess.Write)) { await args.BlobStream.CopyToAsync( fileStream, args.CancellationToken ); await fileStream.FlushAsync(); } }); }

很简单,通过 FilePathCalculator 计算出来文件的具体路径,然后结合配置参数来判断文件是否存在,以及是否进入后续操作。通过 Polly 提供的重试机制来创建文件。

2.3.2 DataBase

数据库 Provider 是利用数据库的 BLOB 类型,将这些大型对象存储到数据库当中,不太建议这样操作。这里不再进行详细介绍,基本大同小异。

2.3.3 各类 OSS (腾讯云为例)

OSS 作为云厂商的标配,基本概念和操作都与 ABP 的 BLOB 相匹配,集成起来也还是比较简单,就是将各个 OSS 的 SDK 塞进来就行。这里注意点的是,每个 BLOB Provider 都会编写一个基于 BlobContainerConfiguration 类型的静态方法,取名都叫做 UseXXX(),并在里面对具体的配置进行赋值。

public static class TencentCloudBlobContainerConfigurationExtensions { public static TencentCloudBlobProviderConfiguration GetTencentCloudConfiguration( this BlobContainerConfiguration containerConfiguration) { return new TencentCloudBlobProviderConfiguration(containerConfiguration); } public static BlobContainerConfiguration UseTencentCloud( this BlobContainerConfiguration containerConfiguration, Action<TencentCloudBlobProviderConfiguration> tencentCloudConfigureAction) { containerConfiguration.ProviderType = typeof(TencentCloudBlobProvider); containerConfiguration.NamingNormalizers.TryAdd<TencentCloudBlobNamingNormalizer>(); tencentCloudConfigureAction(new TencentCloudBlobProviderConfiguration(containerConfiguration)); return containerConfiguration; } }

可能会对这个 TencentCloudBlobProviderConfiguration 有一些好奇,其实就是个套娃,因为直接传入了 BlobContainerConfiguration 对象,里面的各种属性本质上就是对配置项的那个 Dictionary<string,object> 进行操作。

public class TencentCloudBlobProviderConfiguration { public string AppId { get => _containerConfiguration.GetConfigurationOrDefault<string>(TencentCloudBlobProviderConfigurationNames.AppId); set => _containerConfiguration.SetConfiguration(TencentCloudBlobProviderConfigurationNames.AppId, value); } public string SecretId { get => _containerConfiguration.GetConfigurationOrDefault<string>(TencentCloudBlobProviderConfigurationNames.SecretId); set => _containerConfiguration.SetConfiguration(TencentCloudBlobProviderConfigurationNames.SecretId, value); } // ... 其他代码 public TencentCloudBlobProviderConfiguration(BlobContainerConfiguration containerConfiguration) { _containerConfiguration = containerConfiguration; } }

腾讯云的 BLOB Provider 仓库:https://github.com/EasyAbp/Abp.BlobStoring.TencentCloud

2.4 回顾

开发人员可以在模块的 ConfigureService() 阶段为所有容器或者特定容器指定参数。

ABP vNext 框架会注入所有的 BLOB Provider,并注入默认的 IBlobContainer<DefaultContainer> 容器和其他的类型化容器实现。

当需要使用 BLOB 时,开发人员注入了 IBlobContainer 或 IBlobContainer<T>。

BLOB 容器的工厂会根据容器的名称匹配对应的 BLOB Provider 和配置对象。

BLOB Provider 根据 **Args 参数内部附带的配置对象,读取对应的配置信息进行自定义的操作。

三、总结

小型项目直接集成 FileSystem 即可,中大型项目可以使用各种 OSS Provider,BLOB 系统可以简化开发人员对于大量二进制文件的管理操作。最近工作相当杂乱繁忙,下半年希望有时间继续学习更新吧。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpjpfg.html