Установка динамических переменных в startup.cs в asp.net core

Мне сложно понять, как лучше всего установить динамические переменные в Startup.cs. Я хочу получить это значение в контроллере ИЛИ в представлении. Я хочу иметь возможность хранить значения в памяти, а не в файле JSON. Я изучал возможность установки значений в переменные сеанса, но это не кажется хорошей практикой или работой. Как лучше всего устанавливать динамические переменные в Startup.cs?

public class Startup
    {
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();

        //services.AddDbContext<>(options => options.UseSqlServer(Configuration.GetConnectionString("Collections_StatsEntities")));
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseBrowserLink();
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
        }

        app.UseStaticFiles();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }
}

Сохраните в файле конфигурации или всегда можете получить их из таблицы базы данных.

Brad 13.09.2018 21:21
1
1
3 810
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Что ж, дважды щелкните свой settings.settings в своих свойствах, прежде чем компилировать код. вы можете указать переменной имя, тип, область действия (пользователь означает, что ее можно изменить для каждой установки, приложение означает, что она останется прежней с исходным значением и не может быть изменена) и, наконец, значение.

Мне нравится использовать область действия пользователя, если она предназначена для принтера, потому что у всех может быть другое имя принтера. Мне нравится использовать область приложения, если она не будет изменяться в приложении, и я назову ее так: Properties.Settings.Default.SalesOrg.Trim ()

Justin W 14.09.2018 00:44

Это для ASP.NET. OP использует ASP.NET Core.

Chris Pratt 14.09.2018 19:09

Хорошо, тогда каков твой ответ, Крис?

Justin W 14.09.2018 19:18

Не уверен, о чем идет речь. Это неразумно, люди могут не соглашаться, или даже одна ситуация лучше, чем другая. ApplicationSettings полагается на Web.config, который полностью не поддерживается в ASP.NET Core. Ваш ответ буквально не работает. Вкладка «Параметры» даже не существует в свойствах проекта ASP.NET Core.

Chris Pratt 14.09.2018 19:32

Никакого отношения. Вы просто говорите, что я неправ, не отвечая на вопрос. С какой версией Visual Studio вы работаете? В каком году? Какая у вас версия .NET framework?

Justin W 14.09.2018 19:50

Что ж, я действительно закончил тем, что ответил на вопрос FWIW, и я говорю, что ваш ответ неверен, потому что это категорически. Версии не имеют значения. Это вообще присуще ASP.NET Core: ApplicationSettings вообще не работает.

Chris Pratt 14.09.2018 19:54
Ответ принят как подходящий

Глобалы и статика плохие. ASP.NET Core включает встроенный DI специально для того, чтобы этого избежать, поэтому не вводите их повторно. Правильный подход - использовать конфигурацию. Изначально приложение ASP.NET Core поддерживает настройку через JSON (appsettings.json и appsettings.{environment}.json), командную строку, секреты пользователя (также JSON, но хранящиеся в вашем профиле, а не в проекте) и переменные среды. Если вам нужны другие источники конфигурации, доступны другие существующие поставщики, или вы даже можете использовать свои собственные, чтобы использовать все, что вам нравится.

Какой бы источник конфигурации вы ни использовали, конечным результатом будут все параметры конфигурации из всех источников, входящих в IConfigurationRoot. Хотя технически вы можете использовать это напрямую, лучше использовать строго типизированную конфигурацию, предоставляемую IOptions<T> и аналогичные. Просто вы создаете класс, который представляет какой-то раздел в вашей конфигурации:

public class FooConfig
{
    public string Bar { get; set; }
}

Что, например, соответствует чему-то вроде { Foo: { Bar: "Baz" } } в JSON. Затем в ConfigureServices в Startup.cs:

services.Configure<FooConfig>(Configuration.GetSection("Foo"));

Наконец, в вашем контроллере, например:

 public class FooController : Controller
 {
     private IOptions<FooConfig> _config;

     public FooController(IOptions<FooConfig> config)
     {
         _config = config ?? throw new ArgumentNullException(nameof(config));
     }

     ...
 }

Конфигурация считывается при запуске и технически сохраняется в памяти после этого, поэтому ваша жалоба на использование чего-то вроде JSON по большей части бессмысленна. Однако, если вы действительно хотите полностью в памяти, есть поставщик конфигурации памяти. Однако всегда лучше перенести вашу конфигурацию во внешний вид, если это возможно.

Другие вопросы по теме