В моем решении у меня есть проекты для моего API, моего веб-приложения, а также есть другой проект, который включает службы, которые получают некоторую информацию из базы данных и форматируют их, в настоящее время они используются только этим API, но они могут бытьбудет использоваться другими проектами API в будущем.
В моем API есть пара контроллеров, которые возвращают данные JSON из результата, возвращаемого сервисами.
В некоторых случаях сервисам необходимо вызывать APIобработать некоторую информацию перед вызовом запроса в базу данных. Поскольку у меня есть среда dev / staging / prod с собственным URL-адресом, я не хочу жестко кодировать URL-адреса в службах. Я хочу использовать DI для их динамического получения в зависимости от контекста.
В Startup.csмоего API я добавил сервисы. 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, так как это не та работа, для которой они предназначены. Я уверен, что мог бы добиться большего, добавив какой-нибудь класс, внедренный для того, чтобы затем сделать конкретное значение доступным для моих сервисов.
Я знаю, что мог бы также передать _baseUrl непосредственно в качестве аргумента при вызове сервисовот моего контроллера, но так как я пытаюсь лучше понять DI и использовать его, я предпочел бы найти другой способ, если он жизнеспособен.