依赖于 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 API
而 CoreSettings
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
中显示更新的值。一个警告是我不知道该通知过程是如何工作的。如果这最终在每个请求上直接读取配置,那么它的扩展性会很差,所以我建议先给它一个好的测试。
使用重写规则 class.class.
依赖 Injection/Scoped 服务有点挣扎我有一个实现 IRule
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 API
而 CoreSettings
class 中需要的是用于创建 REST Client
.
可以为所欲为。我假设您的 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
中显示更新的值。一个警告是我不知道该通知过程是如何工作的。如果这最终在每个请求上直接读取配置,那么它的扩展性会很差,所以我建议先给它一个好的测试。