我正在尝试在我的微服务启动时创建 cosmos Db 数据库和集合.cs。我尝试了两种方法。一种是为服务创建一个静态扩展方法,并在那里为 cosmos db 进行初始化。另一种方法是创建一个单例(ICosmosDbInitializer(,并使用getAawaiter((在构造函数中进行初始化。Getresult((,因为数据库和集合创建方法是异步的。
我还创建了一个 Ioption 来保存 cosmos db 配置,如数据库名称、DbUrl、访问密钥等。
services.Configure<CosmosDbOptions>((cosmosDbOptions) =>
{
// more code here
});
我的问题是我无法将此选项注入静态扩展方法或单点。
1. 使用静态扩展方法
在启动内部.cs
不确定如何在此处传递 cosmosDbOptions
services.ConfigureCosmosDbClient(???);
静态扩展类内部
public static IServiceCollection ConfigureCosmosDbClient(this IServiceCollection services, CosmosDbOptions cosmosDbOptions)
{
}
2.使用热身的辛格尔顿。需要创建预热单例,以便在第一个用户请求之前创建数据库和集合。在这里,它在运行时尝试注入 Iptions 时失败。
启动内部.cs
services.AddSingleton<CosmosDbInitializer, CosmosDbInitializer>();
public void Configure(IApplicationBuilder app)
{
app.ApplicationServices.GetService<CosmosDbInitializer>();
}
单例内部
public CosmosDbInitializer(CosmosDbOptions cosmosDbOptions) :
{
}
编辑:添加了错误(来自评论(
System.InvalidOperationException:"尝试激活"CosmosDbInitializer"时无法解析类型'CosmosDbOptions'的服务
您将选项注册为TOptions
不像Service
。它会告诉您日志错误消息。
尝试更改
public static IServiceCollection ConfigureCosmosDbClient(this IServiceCollection services, CosmosDbOptions cosmosDbOptions)
{
}
自
public static IServiceCollection ConfigureCosmosDbClient(this IServiceCollection services, IOptionsMonitor<CosmosDbOptions> cosmosDbOptions)
IOptionsMonitor 用于检索选项和管理 TOptions 实例的选项通知。
源