无法将 Ioptions 传递给静态扩展方法或预热单例



我正在尝试在我的微服务启动时创建 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 实例的选项通知。

最新更新