.NET Core DI 将 AddHttpContextAccessor 的信息传递给服务

.NET Core DI passing info of AddHttpContextAccessor to a service

在我的解决方案中,我有针对我的 API、我的 Web 应用程序的项目,还有另一个包含服务的项目,这些服务从数据库中获取一些信息并对其进行格式化,这些目前仅供此使用API,但这些将来可能会被其他 API 项目使用。

我的 API 有几个控制器从服务返回的结果中返回 JSON 数据。

在某些情况下,服务需要先调用 API 来处理一些信息,然后再调用对数据库的请求。因为我有 dev/staging/prod 环境和他们自己的 URL 我不想在服务中硬编码 URL 我想使用 DI 根据上下文动态地获取这些。

在我的 API 的 Startup.cs 中,我添加了 services.AddHttpContextAccessor();在 ConfigureServices(IServiceCollection services) 部分中获取对当前 http 上下文的访问权限:

public void ConfigureServices(IServiceCollection services)
{
   ...
   services.AddHttpContextAccessor();
   ...
}

据此我知道我现在可以直接将信息访问到我的控制器中,我尝试过并且它有效:

public class DataController : ControllerBase
{
    ...
    private readonly string _baseUrl;


    public FeaturesController(...
                                ,IHttpContextAccessor httpContextAccessor)
    {
        ...
        _baseUrl = UrlHelpers.ShowBaseURL(httpContextAccessor) ?? throw new ArgumentNullException(nameof(_baseUrl));
    }
}

public static class UrlHelpers
{
    public static string ShowBaseURL(IHttpContextAccessor httpcontextaccessor)
    {
        var request = httpcontextaccessor.HttpContext.Request;

        var absoluteUri = string.Concat(
            request.Scheme,
            "://",
            request.Host.ToUriComponent(),
            request.PathBase.ToUriComponent());
        return absoluteUri;
    }
}

我可以在服务中做同样的事情,但对我来说,它们不应该直接作用于 httpcontext,因为这不是它们应该做的工作。我确信我可以通过添加某种注入的 class 来做得更好,这样我的服务就可以使用特定的值。

我知道我也可以在从我的控制器调用服务时直接将 _baseUrl 作为参数传递,但由于我试图更好地理解 DI 并使用它,我宁愿找到另一种可行的方法。

我不能给予赞扬,但我选择了 Steven 解决方案,它最有意义