Привязка конфигурации ASP.NET Core 2.0 - PullRequest
0 голосов
/ 30 мая 2018

Я использую Visual Studio 2017, версия 15.7.2 и работаю с ответом по следующей ссылке:

net core 1 (dnx 4.5.1) с предприимчивой библиотекой 6 - настройка соединениястрока

public class DataConfiguration
{
    public string DefaultDatabase { get; set; }
    public List<ConnectionStringSettings> ConnectionStrings { get; set; }
}

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        //Get the Database Connections from appsettings.json
        DataConfig = configuration.Get<DataConfiguration>(); 

        var defaultDb = DataConfig.ConnectionStrings?.Find(c => c.Name == DataConfig.DefaultDatabase);
        DatabaseFactory.SetDatabases(() => new SqlDatabase(defaultDb.ConnectionString), GetDatabase);

        Configuration = configuration;
    }

    public Database GetDatabase(string name)
    {
        var dbInfo = DataConfig.ConnectionStrings.Find(c => c.Name == name);

        if (dbInfo.ProviderName == "System.Data.SqlClient")
        {
            return new SqlDatabase(dbInfo.ConnectionString);
        }

        return new MySqlDatabase(dbInfo.ConnectionString);
    }

Часть, которую я не могу заставить работать:

//Get the Database Connections from appsettings.json
DataConfig = configuration.Get<DataConfiguration>(); 

configuration.Get<DataConfiguration>() возвращает пустой экземпляр DataConfiguration.Я ожидал, что он будет заполнен или привязан к DataConfiguration в файле appsettings.

My appsettings.json:

{
    "DataConfiguration": {
        "DefaultDatabase": "MyDB",
        "ConnectionString": "Server=MyServer;Database=MyDB;Integrated Security=True;MultipleActiveResultSets=true",
        "ProviderName":  "System.Data.SqlClient"
    },
    "Logging": {
        "IncludeScopes": false,
        "LogLevel": {
            "Default": "Warning"
        }
    }
}

My Startup.cs

public class DataConfiguration
    {
        public string DefaultDatabase { get; set; }
        public string ConnectionString { get; set; }
        public string ProviderName { get; set; }
    }
    public class Startup
    {
        public DataConfiguration DataConfig;
        public Startup(IConfiguration configuration)
        {
            DataConfig = configuration.Get<DataConfiguration>();
            DatabaseFactory.SetDatabases(() => new SqlDatabase(DataConfig.ConnectionString), GetDatabase);

            Configuration = configuration;
        }

        public Database GetDatabase(string name)
        {
            if(DataConfig.ProviderName == "System.Data.SqlClient")
            {
                return new SqlDatabase(DataConfig.ConnectionString);
            }
            return null;
        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            var config = new DataConfiguration();
            Configuration.Bind("DataConfiguration", config);
            services.AddMvc();
            services.AddSingleton(config);
            //services.AddSingleton<IConfiguration>(Configuration);
            services.AddTransient<IPatientRepository, PatientRepository>();
        }

Что яотсутствует

1 Ответ

0 голосов
/ 30 мая 2018

Итак, если вы хотите использовать файл настроек таким образом, вы должны написать:

var DataConfig = new DataConfiguration();
Configuration.GetSection(nameof(DataConfiguration)).Bind(DataConfig);

Но обычно настройки и конфигурации используют другой способ: https://docs.microsoft.com/aspnet/core/fundamentals/startup?view=aspnetcore-2.0

или даже проще:

services.Configure<DataConfiguration>configuration.GetSection(nameof(DataConfiguration)))
services.AddScoped(serviceProvider =>
        {
            var options = serviceProvider.GetRequiredService<IOptions<DataConfiguration>>();
            return new SqlDatabase(options.Value.ConnectionString);
        });

Надеюсь, все ясно, но, возможно, последний пример следует немного исправить:)

...