.NET Core DI передает информацию о AddHttpContextAccessor в службу - PullRequest
0 голосов
/ 31 октября 2019

В моем решении у меня есть проекты для моего 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 и использовать его, я предпочел бы найти другой способ, если он жизнеспособен.

1 Ответ

0 голосов
/ 05 ноября 2019

Я не могу отдать должное, но я выбрал решение Стивена, которое наиболее разумно

...