我有一个Swagger项目,正在执行OAuth(令牌提供者+验证)。一切工作正常,但基于我在网上找到的示例,令牌提供程序已作为中间件实现。我想将令牌提供者中间件转换为控制器,以便它在Swagger中显示,并且用户退出了如何获取令牌的烦恼:)。
在startup.cs中,我创建了一个TokenProviderOptions对象,并使用startup.cs中存在的值填充它(因为它们也被传递给了oauth验证部分)。我当时正在做:
app.UseMiddleware<TokenProviderMiddleware>(Options.Create(tokenProviderOptions));
并且中间件正在获取选项。
现在我摆脱了中间件,如何将tokenProvider选项传递给控制器?将其作为单例放入DI中似乎有些奇怪。
答案 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。