依赖于 Config dependency injection/scoped 服务的 URLRewrite 中间件。 .Net核心

URLRewrite middleware that depends on Config dependency injection/scoped service. .Net Core

使用重写规则 class.class.

依赖 Injection/Scoped 服务有点挣扎

我有一个实现 IRule

的重定向 class
class ActivateRedirects : IRule
{        
    public void ApplyRule(RewriteContext context)
    {
        // Do stuff here which relies on CoreSettings (info below)
    }
}

我还有一个 CoreSettings class,其中包含各种设置,其中一些是 ApplyRule 工作所必需的,它在 startup.cs 中初始化如下。

var configurationBuilder = new ConfigurationBuilder();
configurationBuilder.AddJsonFile(Path.Combine(Directory.GetCurrentDirectory(), "site.json"), optional: false, reloadOnChange: true);
IConfigurationRoot root = configurationBuilder.Build();             
CoreSettings s = new CoreSettings();  
services.Configure<CoreSettings>(root.GetSection("Website"));

所以你可以在上面看到,CoreSettings 被创建为一个服务,在大多数情况下我可以使用 DI:

public class SomeOtherClass{
    private CoreSettings Settings;
    public SomeOtherClass(Microsoft.Extensions.Options.IOptionsSnapshot<CoreSettings> S)
    {
        Settings = S.Value;
    } 
    // Do stuff with Settings ....
}

我已经阅读了几页关于为什么我不能简单地将 DI 添加到 ActivateRedirects Class 或使用 app.ApplicationServices.GetRequiredService 显式传递值的原因,但我拥有的一切read 告诉我我不能做什么,我找不到任何东西告诉我我可以!!

在我被告知重写代码以不需要 CoreSettings 进行重写之前,我不能这样做,因为重写规则之一取决于远程服务器通过 REST APICoreSettings class 中需要的是用于创建 REST Client.

的 API 凭据

可以为所欲为。我假设您的 class 定义如下:

public class ActivateRedirects : IRule
{
    private readonly CoreSettings _coreSettings;

    public ActivateRedirects(CoreSettings coreSettings)
    {
        _coreSettings = coreSettings;
    }

    public void ApplyRule(RewriteContext context)
    {
        
    }
}

读取配置文件,和之前一样:

services.Configure<CoreSettings>(root.GetSection("Website"));

接下来,设置您的 RewriteOptions:

var coreSettings = app.ApplicationServices.GetRequiredService<IOptions<CoreSettings>>();
var activateRedirects = new ActivateRedirects(coreSettings.Value);

var rewriteOptions = new RewriteOptions();
rewriteOptions.Rules.Add(activateRedirects);

app.UseRewriter(rewriteOptions);

如果您在 ActivateRedirects 内放置断点并发送请求,您将看到 CoreSettings 字段已被填充。

更新

我认为 IOptionsMonitor<T> 可能就是为此而设计的。它被注册为单例,但会收到选项更改的通知。将 ActivateRedirects 更改为:

public class ActivateRedirects : IRule
{
    private readonly IOptionsMonitor<CoreSettings> _coreSettings;

    public ActivateRedirects(IOptionsMonitor<CoreSettings> coreSettings)
    {
        _coreSettings = coreSettings;
    }

    public void ApplyRule(RewriteContext context)
    {
        
    }
}

并将实例的构造方式更改为:

var coreSettings = app.ApplicationServices.GetRequiredService<IOptionsMonitor<CoreSettings>>();
var activateRedirects = new ActivateRedirects(coreSettings);

对我来说,编辑配置现在会在 CoreSettings 中显示更新的值。一个警告是我不知道该通知过程是如何工作的。如果这最终在每个请求上直接读取配置,那么它的扩展性会很差,所以我建议先给它一个好的测试。