我有一个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

09-05 17:06