Как добавить ConfigurationRoot в Dependency Injection в программе UWP? - PullRequest
1 голос
/ 02 апреля 2019

В моем приложении UWP я могу использовать пакет Microsoft.Extensions.Configuration для чтения из файлов appSettings в формате JSON.

    IConfiguration configuration = new ConfigurationBuilder()
        .AddJsonFile("appsettings.json", true, true)
        .AddJsonFile($"appsettings.{App.UWPENVIRONMENT}.json", true, true)
        .Build();
    string clientId = configuration["security:clientId"];
    string authority = configuration["security:authority"];

То, что мне не кажетсячтобы сделать это сейчас, сделайте конфигурацию доступной для остальной части моего приложения UWP, используя System.Composition Внедрение зависимостей.Из-за способа создания объекта конфигурации (с использованием метода Build ) я не могу понять, как встроить эту конфигурацию в какой-то конструктор.

Одна опция, которая приходит кЯ имею в виду, что я мог бы связать интерфейс с объектом, например:

        conventions.ForObject(configuration)
            .Shared()
            .Export(ecb => ecb.AsContractType<IConfiguration>());

Но пакет DI, похоже, не поддерживает такой способ мышления.Как решить эту проблему:

  1. Найдите способ создания типа.
  2. Свяжите интерфейс с конкретным экземпляром.
  3. Прочее

1 Ответ

0 голосов
/ 02 апреля 2019

Вот код для создания набранного ConfigurationRoot:

    /// <summary>
    /// The configuration for this application.
    /// </summary>
    public class ApplicationConfiguration : ConfigurationRoot
    {
        /// <summary>
        /// The client id of the service application to which we want to connect.
        /// </summary>
#if PRODUCTION
        private const string UWPENVIRONMENT = "Production";
#elif STAGING
        private const string UWPENVIRONMENT = "Staging";
#else
        private const string UWPENVIRONMENT = "Development";
#endif

        /// <summary>
        /// Initializes a new instance of the <see cref="ApplicationConfiguration"/> class.
        /// </summary>
        public ApplicationConfiguration()
            : base(ApplicationConfiguration.GetProviders())
        {
        }

        /// <summary>
        /// Gets the configuration providers.
        /// </summary>
        /// <returns>A list of the configuration providers.</returns>
        private static List<IConfigurationProvider> GetProviders()
        {
            // Build a configuration that reads from the appsettings.json files and extract the providers.
            IConfigurationRoot configurationRoot = new ConfigurationBuilder()
                .AddJsonFile("appsettings.json", true, true)
                .AddJsonFile($"appsettings.{ApplicationConfiguration.UWPENVIRONMENT}.json", true, true)
                .Build();
            return configurationRoot.Providers.ToList();
        }
    }

И добавить его в DI:

    conventions.ForType<ApplicationConfiguration>().Shared().Export(ecb => ecb.AsContractType<IConfiguration>());

Ваш клиент теперь будет использовать файлы конфигурации примерно так же, как веб-сервис .NET Core.

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