【问题标题】:Getting the host name from a scoped service factory从作用域服务工厂获取主机名
【发布时间】:2015-07-08 20:09:22
【问题描述】:

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

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

这是一个好的/受支持的解决方案,还是一个 hack?

【问题讨论】:

    标签: dependency-injection asp.net-core asp.net-core-mvc


    【解决方案1】:

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

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

    在 GitHub 存储库中,similardone 很多 places;它看起来是一个完美的模式。

    【讨论】:

    • 我的 actual 代码实例化了一个不知道IHttpContextAccessor 的外部类,但我明白了这个想法并且示例很清楚。谢谢!
    • 我没有注意到这一点,感谢您提供示例。
    • @DiegoMijelshon 我希望业务层中的主机名更新我从数据库获取的图像的基本路径,所以我应该在业务层中使用 IHttpContextAccessor 还是有其他选择。我想保持我的业务层干净,不想在那里使用 IHttpContextAccessor。
    猜你喜欢
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    • 1970-01-01
    • 2019-12-12
    • 2010-10-23
    • 2015-07-14
    相关资源
    最近更新 更多