BLOB存储:创建自定义提供程序
本文档通过示例说明如何为BLOB存储系统创建新的存储提供程序。
请先阅读 BLOB存储文档 了解如何使用BLOB存储系统。本文档仅涵盖如何创建新的存储提供程序。
示例实现
第一步是创建一个实现 IBlobProvider 接口或继承自 BlobProviderBase 抽象类的类。
using System.IO;
using System.Threading.Tasks;
using Volo.Abp.BlobStoring;
using Volo.Abp.DependencyInjection;
namespace AbpDemo
{
public class MyCustomBlobProvider : BlobProviderBase, ITransientDependency
{
public override Task SaveAsync(BlobProviderSaveArgs args)
{
//TODO...
}
public override Task<bool> DeleteAsync(BlobProviderDeleteArgs args)
{
//TODO...
}
public override Task<bool> ExistsAsync(BlobProviderExistsArgs args)
{
//TODO...
}
public override Task<Stream> GetOrNullAsync(BlobProviderGetArgs args)
{
//TODO...
}
}
}
MyCustomBlobProvider继承自BlobProviderBase并重写了抽象方法。具体实现由您决定。- 实现
ITransientDependency接口会将此类作为瞬时服务注册到依赖注入系统中。
注意:命名约定很重要。如果您的类名不以
BlobProvider结尾,则必须手动为IBlobProvider注册/公开您的服务。
这样就完成了。现在,您可以配置容器(在模块的 ConfigureServices 方法内)以使用 MyCustomBlobProvider 类:
Configure<AbpBlobStoringOptions>(options =>
{
options.Containers.ConfigureDefault(container =>
{
container.ProviderType = typeof(MyCustomBlobProvider);
});
});
如果要配置特定容器,请参阅 BLOB存储文档。
BlobContainerConfiguration扩展方法
如果想提供更简单的配置方式,可以为 BlobContainerConfiguration 类创建一个扩展方法:
public static class MyBlobContainerConfigurationExtensions
{
public static BlobContainerConfiguration UseMyCustomBlobProvider(
this BlobContainerConfiguration containerConfiguration)
{
containerConfiguration.ProviderType = typeof(MyCustomBlobProvider);
return containerConfiguration;
}
}
然后可以使用扩展方法更轻松地配置容器:
Configure<AbpBlobStoringOptions>(options =>
{
options.Containers.ConfigureDefault(container =>
{
container.UseMyCustomBlobProvider();
});
});
额外配置选项
BlobContainerConfiguration 允许添加/删除提供程序特定的配置对象。如果您的提供程序需要额外配置,可以为 BlobContainerConfiguration 创建一个包装类,以实现类型安全的配置选项:
public class MyCustomBlobProviderConfiguration
{
public string MyOption1
{
get => _containerConfiguration
.GetConfiguration<string>("MyCustomBlobProvider.MyOption1");
set => _containerConfiguration
.SetConfiguration("MyCustomBlobProvider.MyOption1", value);
}
private readonly BlobContainerConfiguration _containerConfiguration;
public MyCustomBlobProviderConfiguration(
BlobContainerConfiguration containerConfiguration)
{
_containerConfiguration = containerConfiguration;
}
}
然后可以这样修改 MyBlobContainerConfigurationExtensions 类:
public static class MyBlobContainerConfigurationExtensions
{
public static BlobContainerConfiguration UseMyCustomBlobProvider(
this BlobContainerConfiguration containerConfiguration,
Action<MyCustomBlobProviderConfiguration> configureAction)
{
containerConfiguration.ProviderType = typeof(MyCustomBlobProvider);
configureAction.Invoke(
new MyCustomBlobProviderConfiguration(containerConfiguration)
);
return containerConfiguration;
}
public static MyCustomBlobProviderConfiguration GetMyCustomBlobProviderConfiguration(
this BlobContainerConfiguration containerConfiguration)
{
return new MyCustomBlobProviderConfiguration(containerConfiguration);
}
}
- 在
UseMyCustomBlobProvider方法中添加了动作参数,允许开发者设置额外选项。 - 新增了
GetMyCustomBlobProviderConfiguration方法,可在MyCustomBlobProvider类内部使用以获取配置值。
然后任何人都可以如下设置 MyOption1:
Configure<AbpBlobStoringOptions>(options =>
{
options.Containers.ConfigureDefault(container =>
{
container.UseMyCustomBlobProvider(provider =>
{
provider.MyOption1 = "my value";
});
});
});
最后,您可以使用 GetMyCustomBlobProviderConfiguration 方法访问额外选项:
public class MyCustomBlobProvider : BlobProviderBase, ITransientDependency
{
public override Task SaveAsync(BlobProviderSaveArgs args)
{
var config = args.Configuration.GetMyCustomBlobProviderConfiguration();
var value = config.MyOption1;
//...
}
}
参与贡献?
如果您创建了一个新的提供程序,并认为它对其他开发者有用,请考虑向 GitHub 上的 ABP 框架 贡献代码。
抠丁客


