Нестроковая конфигурация в ASP. Net Core 3.1? - PullRequest
2 голосов
/ 07 января 2020

В настоящее время я использую строки для определения и использования маршрутов, ролей, политик и т. Д. c. Легко ошибиться или получить неправильные значения строки, так как они не являются частью автозаполнения IDE и проверки типов.

Есть ли способ использовать какие-либо ссылки или символы в ASP. NET Core 3.1? Может быть, через провайдеров конфигурации и DI?

Что я хотел бы увидеть, так это определить эти значения конфигурации строки где-то, а затем ссылаться на них в различных частях приложения?

Ответы [ 2 ]

1 голос
/ 07 января 2020

Почему бы не использовать классы констант?

public static class RoutingConstants
{
  public const string Route1 = "route1";
  ...
}

И то же самое для любых других нужд

Затем вы можете получить доступ к константе везде, как эта RoutingConstants.Route1

0 голосов
/ 07 января 2020

Авторизация с ролями :
Вы можете преобразовать роли в константы и использовать их следующим образом:

public class StaticRoles
{
    public const string A = "A";
    public const string B = "B";
    public const string C = "C";
    public const string ABC = "A, B, C";
}

Используйте эти константы следующим образом:

[Authorize(Roles = StaticRoles.ABC)]
[Route("foo")]
public IActionResult Foo()

Использование маршрутов в представлениях :
При создании ссылок вы можете использовать помощники тегов для ссылок, которые автоматически читают атрибут Route из метода контроллера:

<a asp-controller="@nameof(HomeController).Replace("Controller", string.Empty)" asp-action="@nameof(HomeController.Foo)">Foo</a>

Вам следует Реорганизовать .Replace("Controller", string.Empty) в метод расширения String для уменьшения размазывания кода.

Использование маршрутов в коде :
Если вы хотите использовать те же функции, что и помощники тегов в коде, вы можно использовать класс LinkGenerator , который автоматически вводится

Использовать внедрение зависимостей, чтобы получить ссылку на LinkGenerator

public class HomeController : Controller
{
    private readonly LinkGenerator linkGenerator;

    public HomeController(LinkGenerator linkGenerator)
    {
        this.linkGenerator = linkGenerator;
    }

    // ..
}

Внутри HomeController, вы можете затем использование

linkGenerator.GetPathByAction(
    nameof(HomeController.Index),
    nameof(HomeController).Replace("Controller", string.Empty))
};

GetPathByAction имеет третий параметр, когда у маршрута есть параметры в составе URL:

linkGenerator.GetPathByAction(
    nameof(HomeController.Index),
    nameof(HomeController).Replace("Controller", string.Empty),
    values: new { version = user.Version})
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...