Как правильно вводить Appsettings.json из основного приложения и как это сделать - PullRequest
0 голосов
/ 15 октября 2019

У меня есть основное приложение .net, которое называется AppOne . В его appsettings.json я определяю, какие API он должен вызывать. Например:

"ApiSettings": {
"UrlToCall": "http://test",
}

Затем есть моя промежуточная и общая библиотека проектов, которая называется InfraApp , которая сама выполняет вызов к API. Там может быть второе приложение под названием AppTwo , где URL-адрес отличается. И AppOne и AppTwo ссылаются на InfraApp , так как логика является общей, и вызывают код там, чтобы выполнить фактический вызов. Однако настройки (которые определяют, какой URL вызывать) относятся к самим API и поэтому не могут быть указаны в InfraApp .

Давайте пока рассмотрим только AppOne . ,Такие настройки регистрируются через шаблон параметров (https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/options?view=aspnetcore-3.0) в файле startup.cs:

services.AddOptions();
var apiSettings = Configuration.GetSection("ApiSettings");
services.Configure<ApiSettings>(apiSettings);

, и у меня есть мой класс ApiSettings:

public class ApiSettings
{
    public string UrlToCall { get; set; }
}

, что является правильнымспособ передачи таких ApiSettings в InfraApp ? InfraApp ничего не знает о ApiSettings, поскольку это определено в AppOne . Должен ли я определить ApiSettings класса в InfraApp ? ИМХО звучит неправильно, потому что это что-то особенное в API AppOne , но, возможно, я не так думаю. Спасибо!

1 Ответ

0 голосов
/ 15 октября 2019

Я думаю, если у вас есть что-то вроде этого:

    public interface IApiSettings
        {
            string UrlToCall { get; set; }
        }
        public class ApiSettings:IApiSettings
        {
            public string UrlToCall { get; set; }
            public ApiSettings()
            {
                    ...
                Console.WriteLine($"ApiSettings");
                        ...
            }
        }

        public class IInfraApp{}

        public class InfraApp : IInfraApp
        {
            private IApiSettings _ApiSettings;
            //using Microsoft.Extensions.Options:
            public InfraApp(IOptions<ApiSettings> settings)
            {
                _ApiSettings = (IApiSettings)settings.Value;
                Console.WriteLine($"InfraApp {_ApiSettings.UrlToCall}");
            }
        }

, тогда вы можете добавить / зарегистрировать что-то вроде этого:

    public void ConfigureServices(IServiceCollection services)
    {
            services.AddControllers();
            ...
            ...
            //
            services.Configure<ApiSettings>(Configuration);
            services.AddTransient<IInfraApp, InfraApp>();
            ...
            ...
            //get instance of infraapp:
            var provider = services.BuildServiceProvider();
            var infraapp = provider.GetService<IInfraApp>();
            //
            ...
            ...
    }
...