使用 IConfigureOptions 配置注入的依赖项

Chr*_*ris 4 c# asp.net asp.net-core-mvc .net-core asp.net-core

我创建了一个 ASP.NET Core 1.0.1 WebApi 项目,并尝试在我的控制器中使用它之前使用一些自定义选项初始化注入的依赖项。在线搜索后,我发现了几篇文章(这里这里这里解释了如何使用 IConfigureServices 来做到这一点。看起来很简单!不幸的是,我无法让它工作,我不明白为什么,我当然这一定是一个简单的疏忽..

我创建了一个简单的项目,并添加了以下类来说明最基本的场景:

public class Tester
{
    public void Initialize(TestOptions options)
    {
        //do something with options.
    }
}

public class TestConfigurator : IConfigureOptions<TestOptions>
{
    private Tester _tester;

    public TestConfigurator(Tester tester)
    {
        _tester = tester;
    }

    public void Configure(TestOptions options)
    {
        _tester.Initialize(options);
    }
}

public class TestOptions
{
}
Run Code Online (Sandbox Code Playgroud)

“Tester”类被注入到 Controller 类的构造函数中:

[Route("api/[controller]")]
public class ValuesController : Controller
{
    public ValuesController(Tester tester)
    {
        //do something with tester..
    }
    // GET api/values
    [HttpGet]
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,我在Startup类的ConfigureServices中添加了以下配置:

    public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services.AddApplicationInsightsTelemetry(Configuration);
        services.AddOptions();
        services.AddMvc();
        services.AddSingleton<Tester, Tester>();
        services.AddSingleton<IConfigureOptions<TestOptions>, TestConfigurator>();
    }
Run Code Online (Sandbox Code Playgroud)

当我运行项目并调用“api/values”调用时,会创建 Tester 类并将其注入 ValuesController,但 TestConfigurator 类永远不会被构造,因此该类永远不会使用选项类进行初始化。我缺少什么?

更新 下面的答案当然对于这个简化的例子都是有效的。我现在意识到我有点过于简单化了,因为我使用的依赖项(此处显示为 Tester)来自第 3 方库,所以我没有可以使用的构造函数。将第 3 方类包装在扩展类中就可以解决问题,但如果有人对在不修改其构造函数的情况下操作它有其他建议,那么我仍然愿意接受建议,谢谢。

gil*_*hal 6

好吧,现在我明白了,我对所有的编辑感到愚蠢。

你用IOptions错了,这让我很困惑。

实现自定义IConfigurationOptions<>使您能够从数据库配置选项,或者仅使用不同的类(而不是 lambda)

您想要做的,是根据这些选项实例化一个 Tester 类,这很好 - 但这不是工作IConfigureOptions<>

为了Tester根据您的类进行初始化TestOptions,您应该在接收它的类上创建一个构造函数,Tester如下所示

public class Tester
{
    public Tester(IOptions<TestOptions> options)
    {
        //do something with options.
    }
}
Run Code Online (Sandbox Code Playgroud)

你正在尝试做的事情将会奏效。