Не удается прочитать настройки приложения в проекте .NET Core API - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть проект .NET Core API, и я пытаюсь прочитать некоторые настройки из файла appsettings.json .

Файл выглядит так:

{
  "Logging": {
    "IncludeScopes": false,
    "Debug": {
      "LogLevel": {
        "Default": "Warning"
      }
    },
    "Console": {
      "LogLevel": {
        "Default": "Warning"
      }
    }
  },
  "ConnectionString": "abc"
}

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

ConfigurationManager.AppSettings["ConnectionString"];

но я получаю null, и, видимо, настройки приложения вообще не обнаружены.

Edit:

Вот что у меня сейчас:

startup.cs

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

        public static IConfiguration Configuration { get; set; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<MyContext>();
            services.AddMvc();
            services.Configure<ConnectionStringSettings>(Configuration);
        }
}

ConnectionStringSettings.cs

 public class ConnectionStringSettings
    {
        public string ConnectionString { get; set; }
    }

appsettings.json

{
  "Logging": {
    ...
  },
  "ConnectionStrings": {
    "Debug": "abc"
  }
}

MyContext.cs открытый класс MyContext: DbContext { строка x;

    public MyContext() { }

    public MyContext(DbContextOptions<MyContext> options)
        : base(options) { }

    public MyContext(IOptions<ConnectionStringSettings> connectionStringSettings)
    {
        x = connectionStringSettings.Value.ConnectionString;
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
       //here I need my connection string
        optionsBuilder.UseMySql(connectionString);
    }

}

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Вы должны использовать конфигурацию при запуске =>

    public void ConfigureServices(IServiceCollection services)
    {
       var section = Configuration.GetSection("ConnectionString");
       var value= Configuration.GetValue<string>("ConnectionString")
    }
0 голосов
/ 18 сентября 2018

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

Обновите файл конфигурации appsettings.json , чтобы он содержалновый объект JSON для параметров вашей базы данных

{
    "Logging": {
        "LogLevel": {
            "Default": "Warning"
        }
    },
    "DatabaseOptions": {
        "ConnectionString": "<Connection String>"
    }
}

Создайте класс модели, который будет соответствовать вашей конфигурации DatabaseOptions на

public class DatabaseOptions
{
    public string ConnectionString { get; set; }
}

Затем обновите ваш класс Startup'ConfigureServices метод для регистрации экземпляра IOptions<DatabaseOptions>

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.Configure<DatabaseOptions>(Configuration.GetSection("DatabaseOptions"));
}

И наконец, обновите ваш конструктор контекста, чтобы внедрить ваш экземпляр IOptions<DatabaseOptions>, ASP.NET Core будет обрабатывать внедрение зависимостей для вас до тех пор, покакогда вы регистрируете свой контекст в коллекции сервисов.

public class MyContext
{
    private readonly DatabaseOptions databaseOptions;

    public MyContext(DbContextOptions<MyContext> options, IOptions<DatabaseOptions> databaseOptions)
        : base(options)
    {
        this.databaseOptions = databaseOptions.Value;
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        //here I need my connection string
        optionsBuilder.UseMySql(databaseOptions.ConnectionString);
    }
}

Лично мне не нравится именовать классы с опциями в имени, когда этот класс будет использоваться с IOptions<T> но, как разработчики, мы можем потратить много времени на программирование, думая только об именах классов и переменных, не стесняйтесь переименовывать, как вам угодно.

0 голосов
/ 18 сентября 2018

Для .NET Core 2.x вам необходимо настроить конфигурацию при запуске, как показано ниже

 public partial class Startup
    {
        public static IConfiguration Configuration;

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

Затем получить доступ, как показано ниже

Configuration.GetConnectionString("System")

Вам также должны быть проложены строки подключениякак показано ниже.

"ConnectionStrings": {
    "System": "{connection String}"
  }

Это позволит использовать несколько строк при необходимости, но работать, даже если у вас есть только одна.

РЕДАКТИРОВАТЬ: Как только вы получите строку, как говорит ColinMв его ответе вам нужно зарегистрировать строку с классом, который вы можете добавить в свои классы.При запуске, как показано ниже.

services.AddSingleton<IConnectionStringFactory, ConnectionStringFactory>(serviceProvider => new ConnectionStringFactory(Configuration.GetConnectionString("System")));

Ваш класс строки подключения ...

public class ConnectionStringFactory : IConnectionStringFactory
{
    private readonly string _connectionString;

    public ConnectionStringFactory(string connectionString)
    {
        _connectionString = connectionString;
    }

    public string Invoke()
    {
        return _connectionString;
    }
}

Внедрите в свой класс как ...

public class ClassName
{
    private readonly IConnectionStringFactory _connectionStringFactory;

public ClassName(IConnectionStringFactory connectionStringFactory)
    {
        _connectionStringFactory = connectionStringFactory;
    }

...
}

Ваш интерфейсможет быть просто, как показано ниже

public interface IConnectionStringFactory
{
}

Вам не нужно использовать интерфейс, но я бы порекомендовал этот подход

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...