Asp.net Core:中间件到控制器的转换问题?

时间:2019-01-07 19:08:14

标签: c# asp.net-core

我有一个Swagger项目,正在执行OAuth(令牌提供者+验证)。一切工作正常,但基于我在网上找到的示例,令牌提供程序已作为中间件实现。我想将令牌提供者中间件转换为控制器,以便它在Swagger中显示,并且用户退出了如何获取令牌的烦恼:)。

在startup.cs中,我创建了一个TokenProviderOptions对象,并使用startup.cs中存在的值填充它(因为它们也被传递给了oauth验证部分)。我当时正在做:

app.UseMiddleware<TokenProviderMiddleware>(Options.Create(tokenProviderOptions));

并且中间件正在获取选项。

现在我摆脱了中间件,如何将tokenProvider选项传递给控制器​​?将其作为单例放入DI中似乎有些奇怪。

1 个答案:

答案 0 :(得分:3)

您可以使用IOptions<T>界面从控制器和其他服务中的依赖项注入容器中解析选项。例如:

public class TokenProviderController
{
    private readonly IOptions<TokenProviderOptions> _options;

    public TokenProviderController(IOptions<TokenProviderOptions> options)
    {
        _options = options;
    }
}

然后您可以使用_options.Value访问选项值。

可以在启动类中配置选项。通常,您从配置中填充它们:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    private IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<TokenProviderOptions>(Configuration);
    }

    // ...
}

如果您的选项包含硬编码值,则可以使用委托来配置绑定:

services.Configure<TokenProviderOptions>(o =>
{
    o.Foo = "Bar";
});

有关更多信息,请访问the documentation on the options pattern