在非控制器类中使用依赖注入?

时间:2017-01-11 13:03:00

标签: c# asp.net dependency-injection

我有一个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设为静态,然后在启动时分配了值,但这似乎不是最佳解决方案

1 个答案:

答案 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>();
}

来源:Using Options and configuration objects