The default MS DI container does not support property injection (it's not good design). But we can come up with a strategy that will be better than that.
You could create and bind a service that collects all your rules and returns a RewriteOptions
. Since your app is already built, you can resolve from the container.
Add the new services and all rules when building your web app.
builder.Services.AddTransient<IRule, MyRule>();
builder.Services.AddTransient<IRewriteOptionsBuilder, RewriteOptionsBuilder>();
Then just resolve the builder when configuring rewrite.
app.UseRewriter(app.Services.GetRequiredService<IRewriteOptionsBuilder>().Build())
Rewrite Builder
public interface IRewriteOptionsBuilder
{
RewriteOptions Build();
}
class RewriteOptionsBuilder : IRewriteOptionsBuilder
{
private readonly IEnumerable<IRule> _rewriteRules;
public RewriteOptionsBuilder(IEnumerable<IRule> rewriteRules)
{
_rewriteRules = rewriteRules;
}
public RewriteOptions Build()
{
var options = new RewriteOptions();
foreach (IRule rule in _rewriteRules)
{
options.Add(rule);
}
return options;
}
}