从作用域服务工厂获取主机名

Getting the host name from a scoped service factory

我正在创建的其中一个服务需要当前主机名作为参数(不同的请求使用不同的主机名,这会影响我的服务使用的外部资源):

public class Foo
{
    public Foo(string host) {...}
}

我正在将其注册为作用域:

public void ConfigureServices(IServiceCollection services)
{
    services.AddScoped(s => new Foo(/* get host name for the current request */));
}

此时获取主机名的最简洁方法是什么?


更新:我想到了这个:

private static Foo GetFoo(IServiceProvider services)
{
    var contextAccessor = services.GetRequiredService<IHttpContextAccessor>();
    var host = contextAccessor.HttpContext.Request.Host.Value;
    return new Foo(host);
}

它是 good/supported 解决方案还是 hack?

由于您已将其正确定义为作用域,因此您可以直接在 Foo 的构造函数中使用 IHttpContextAccessor

public class Foo
{
    public Foo(IHttpContextAccessor contextAccessor) 
    {
        var host = contextAccessor.HttpContext.Request.Host.Value;
        // remainder of constructor logic here
    }
}

GitHub 存储库中的 similar is done many places 内容;它看起来是一个完美的模式。