我有一个DocumentRenderer类,它调用外部API。 DocumentRenderer需要一个AccessKey,它存储在我的appsettings.json配置文件中。我想要一个新实例化的DocumentRenderer对象,默认情况下,使用配置文件中指定的AccessKey。但是,我无法弄清楚如何在startup.cs之外实现这一点。 (我使用的是ASP.NET Core)
这是我迄今为止所做的尝试:
将DocumentRenderer添加到appsettings.json:
"DocumentRenderer": {
"AccessKey": "<key>",
"EndpointUrl": "<url>",
"OutputFormat" : "pdf"
}
创建了一个&#34; DocumentRendererOptions&#34; 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设为静态,然后在启动时分配了值,但这似乎不是最佳解决方案
答案 0 :(得分:0)
将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>();
}