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
并覆盖abstract
方法. 实际的实现取决于你.- 实现
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框架做出贡献.