.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 解决方案,它最有意义
在我的解决方案中,我有针对我的 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 解决方案,它最有意义