我有一个DocumentRenderer类,该类调用一个外部API。 DocumentRenderer需要一个AccessKey,该密钥存储在我的appsettings.json配置文件中。我想要一个新实例化的DocumentRenderer对象,默认情况下使用配置文件中指定的AccessKey。但是,我不知道如何在startup.cs之外实现此目标。 (我正在使用ASP.NET Core)
到目前为止,这是我尝试过的方法:
将DocumentRenderer添加到appsettings.json:
"DocumentRenderer": {
"AccessKey": "<key>",
"EndpointUrl": "<url>",
"OutputFormat" : "pdf"
}
创建了一个“ DocumentRendererOptions” POCO:
public class DocumentRendererOptions
{
public string AccessKey { get; set; }
public string EndpointUrl { get; set; }
public string OutputFormat { get; set; }
}
将DocumentRendererOptions注册为单例服务,并在startup.cs的ConfigureServices方法中将来自appsettings.json的选项绑定到该服务:
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<DocumentRendererOptions>();
services.Configure<DocumentRendererOptions>(options => Configuration.GetSection("DocumentRenderer").Bind(options));
}
最后,我有了DocumentRenderer类:
public class DocumentRenderer
{
private readonly string _endpointUrl;
private readonly string _accessKey;
private readonly string _outputFormat;
public DocumentRenderer()
{
}
public DocumentRenderer(IOptions<DocumentRendererOptions> options)
{
_accessKey = options.Value.AccessKey;
_endpointUrl = options.Value.EndpointUrl;
_outputFormat = options.Value.OutputFormat;
}
}
我错误地认为这将允许我使用默认选项实例化一个新的DocumentRenderer对象,但是显然缺少某些东西。
到目前为止,我读过的每篇文章都只谈到将这种方法与控制器一起使用,并允许DI来完成其余的工作,但是DocumentRenderer并不是控制器。
作为临时修复,我刚刚将DocumentRendererOptions设为静态,然后在启动时分配了值,但这似乎不是最佳解决方案
最佳答案
同时向服务注册DocumentRenderer
,以便框架为您实例化它
public void ConfigureServices(IServiceCollection services)
{
// Adds services required for using options.
services.AddOptions();
// Registers the following lambda used to configure options.
services.Configure<DocumentRendererOptions>(Configuration.GetSection("DocumentRenderer"));
//register other services
services.AddSingleton<DocumentRenderer>();
}
资料来源:Using Options and configuration objects