Определение настроек prod/dev по connection string

189
02 апреля 2018, 21:05

Делаю небольшое веб-приложение для работы с лаками для ногтей.

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

А dev версия выглядит так:

И сейчас это сделано через анализ адресной строки, в файле Views/Shared/_Layout.cshtml:

@functions{
    private bool IsDevEnv()
    {
        return Context.Request.Host.Value.Contains("localhost");
    }
}
<!DOCTYPE html>
<html>
....
@if (IsDevEnv())
{
    <a asp-area="" asp-controller="Home" asp-action="Index" class="navbar-brand">Polish <span>Hub</span></a>
}
else
{
    <a asp-area="" asp-controller="Home" asp-action="Index" class="navbar-brand">Polish Hub</a>
}

Однако это не совсем то, что мне нужно: мне нужно проверять параметры sql server connection string, а не hostname сервера. (К сожалению, таковы особености appharbor'а по работе с core на текущий день - в классическом asp.net mvc нормально происходят замены переменных)

Как можно добраться до этих настроек (connection string)в asp.net core?

Можно ли как-то в view добраться до Configuration.GetConnectionString? Или, если нельзя, то с какого уровня определить переменную mode (prod/dev), чтобы пробрасывать её в layout страницы.

Answer 1

До настроек во View можно добраться через @inject

Допустим у нас в appSettings.json написано такое

{
    "SomeOption" : {
        "SomeProp" : 1000
    }
}

Создадим класс MyAppOptions и в нем создадим свойство с названием совпадающим с названием опции

public int SomeProp { get; set; }

Теперь перейдем к Startup.cs в нем у нас уже должно быть поле

private readonly IConfiguration _configuration;

которому присваивается значение через конструктор. Далее переходим в метод ConfigureServices(...) и добавляем такое

services.Configure<MyAppOptions>(_configuration.GetSection("SomeOption"));

Теперь во View

@using Microsoft.Extensions.Options
@inject IOptions<MyAppOptions> options
 нужном месте@
@options.Value.SomeProp
Answer 2

Спасибо @Bullson за указание правильного ответа, сделал у себя так:

В startup.cs:

services.Configure<MyAppOptions>(options =>
{
    options.SqlConnectionStringBuilder = new SqlConnectionStringBuilder(Configuration["ConnectionStrings:DefaultConnection"]);
});

Сам класс настроек:

public class MyAppOptions
{
    public SqlConnectionStringBuilder SqlConnectionStringBuilder { get; set; }
    public bool IsDevEnv => this.SqlConnectionStringBuilder.IntegratedSecurity;
}

(Я воспользовался тем, что на dev окружение я захожу без пароля по логину windows)

И во Views/Shared/_Layout.cshtml я делаю inject настроек:

@using AuroraBorealis.PolishHub.WebApp.Data
@using Microsoft.Extensions.Options
@inject IOptions<MyAppOptions> options
<!DOCTYPE html>
<html>
....
@if (options.Value.IsDevEnv)
{
    <a asp-area="" asp-controller="Home" asp-action="Index" class="navbar-brand">Polish <span>Hub</span></a>
}
else
{
    <a asp-area="" asp-controller="Home" asp-action="Index" class="navbar-brand">Polish Hub</a>
}

Ссылки по теме:

  • Настройка приложения ASP.NET Core
  • Передача конфигурации через IOptions
  • Configuring properties from config.json using services.Configure
  • Конфигурация ASP.NET Core приложения через IOptions
READ ALSO
Не передаются параметры в метод

Не передаются параметры в метод

Есть такой контроллер:

189
WPF: замостить контейнер элементами

WPF: замостить контейнер элементами

Здравствуйте, сделал элемент UserControl, который может иметь разные высоту и ширинуНеобходимо создать алгоритм который будет при добавлении...

227
ASP.NET Identity валидация пользователя

ASP.NET Identity валидация пользователя

Создал класс для валидации пользователяМетод ValidateAsync возвращает, что ошибок нет (Errors

133