Доступ к свойствам конфигурации для декораторов классов в ASP.NET Core

На основе этого вопроса здесь , я работаю над решением для привязки контроллеров к определенным URL. Эти URL-адреса настроены в appsettings.json.

Поскольку решение основано на декораторах, я ищу способ внедрить объект IConfiguration для декораторов.

Пример:

[PortActionConstraint(configuration.GetValue<string>("Product1:Port")]
[Route("api/[controller]")]
[ApiController]
public class Product1Controller : ControllerBase

Короче говоря, как я могу внедрить IConfiguration любого интерфейса в декоратор класса?


person Sathish Guru V    schedule 27.05.2019    source источник


Ответы (1)


Самое простое решение для этого — использовать шаблон локатора службы внутри реализации ограничения для извлечения объекта IConfiguration.

Таким образом, в методе «IsValidForRequest» извлеките службу через контекст HTTP:

public override bool IsValidForRequest(RouteContext routeContext, ActionDescriptor action)
{
    var configuration = routeContext.HttpContext.RequestServices.GetService<IConfiguration>();

    // do something with the configuration
}

В качестве альтернативы вы также можете реализовать IActionConstraintFactory, что позволит вам правильно разрешать зависимости с помощью внедрения конструктора. Это потребует от вас реализации IActionConstraint самостоятельно. Таким образом, для этого простого требования использование ActionMethodSelectorAttribute с локатором услуг, вероятно, проще.

person poke    schedule 27.05.2019
comment
Спасибо Поке. Я возился с DI в конструкторе атрибутов, теперь я могу приступить к вашему решению. - person Sathish Guru V; 28.05.2019
comment
RE ваше предложение по редактированию: GetService<T> не устарело. Вам может понадобиться добавить использование для пространства имен Microsoft.Extensions.DependencyInjection, чтобы оно скомпилировалось. - person poke; 28.05.2019