asp.net IRule中的依赖注入

k97glaaz  于 2023-03-20  发布在  .NET
关注(0)|答案(1)|浏览(179)

在我的net 7应用程序中,有没有办法在我的规则中利用内置的IOC容器(实现了IRule),或者我必须在从容器注册它时求助于手动注入它的依赖项?
这就是我现在的工作:

app.UseRewriter(new RewriteOptions().Add(new MyRyle()));

我所追求的是这样的东西,所以我不必亲自修改规则:

app.UseRewriter(new RewriteOptions().Add<MyRule>())

如果这不起作用,也许有一种方法可以做财产注入?

snz8szmq

snz8szmq1#

默认的MS DI容器不支持属性注入(it's not good design),但是我们可以想出一个比这更好的策略。
您可以创建并绑定一个服务来收集所有规则并返回RewriteOptions。由于您的应用已经构建,因此可以从容器解析。
生成Web应用时添加新服务和所有规则。

builder.Services.AddTransient<IRule, MyRule>();
builder.Services.AddTransient<IRewriteOptionsBuilder, RewriteOptionsBuilder>();

然后在配置重写时解析构建器。

app.UseRewriter(app.Services.GetRequiredService<IRewriteOptionsBuilder>().Build())

重写生成器

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;
    }
}

相关问题