在我的解决方案中,我有用于我的API的项目,我的Web应用程序,也有另一个项目,其中包括服务,这些项目正在从数据库中获取一些信息并对其进行格式化,这些项目目前仅供此API使用,但这些项目将来可能会被其他API项目使用。
我的API有几个控制器,它们从服务返回的结果中返回JSON数据。
在某些情况下,在调用对数据库的请求之前,服务需要调用API来处理一些信息。因为我的dev/staging/prod环境有自己的URL,所以我不想在服务中硬编码URL,我想使用DI来根据上下文动态地获取这些URL。
在我的API的Startup.cs中,我在ConfigureServices(IServiceCollection服务)部分添加了services.AddHttpContextAccessor();,以访问当前的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,因为这不是它们应该做的工作。我确信我可以通过添加某种注入的类来做得更好,这样就可以使特定的值对我的服务可用。
我知道当从我的控制器调用服务时,我也可以直接传递_baseUrl作为参数,但由于我试图更好地理解DI并使用它,所以我宁愿寻找另一种可行的方法。
发布于 2019-11-06 04:39:45
我不能肯定,但我选择了Steven solution,这是最有意义的
https://stackoverflow.com/questions/58650863
复制相似问题