Как внедрить IConfiguration из файла конфигурации appsetting.json в его код?

После прочтения официальной документации я все еще не понимаю, как загрузить и использовать этот файл конфигурации appsetting.json. В теории все кажется логичным, но когда я пытаюсь настроить это в своем классе, у меня возникает проблема.

Позвольте мне сначала дать вам часть моего кода. Для тех, кого я знаю, я делаю это в реализации IndentityServer4, но мне нужно сделать то же самое в моем API и клиенте.

Я изменил файл Program.cs, добавив в него новый способ загрузки файла конфигурации, как описано в документации:

    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .ConfigureAppConfiguration((hostingContext, config) =>
                {
                    config.SetBasePath(Directory.GetCurrentDirectory());
                    config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: false);
                })
                .UseStartup<Startup>();
    }

Я не сделал ничего, связанного с конфигурацией в моем Statup.cs

    public class Startup
    {
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
            services.AddIdentityServer()
                .AddDeveloperSigningCredential(persistKey: false)
                .AddTestUsers(Config.GetUsers())
                .AddInMemoryIdentityResources(Config.GetIdentityResources())
                .AddInMemoryApiResources(Config.GetApiResources())
                .AddInMemoryClients(Config.GetClients());
        }

        // 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.UseDeveloperExceptionPage();
            }

            app.UseIdentityServer();
            app.UseStaticFiles();
            app.UseMvcWithDefaultRoute();
        }
    }

И, наконец, мой Config.cs или часть моего конфигурационного файла. Это в этом я хочу использовать мой конфиг. Допустим, для простоты я хотел бы загрузить все свои строки из моего конфигурационного файла.

    public static class Config
    {
        public static IEnumerable<Client> GetClients()
        {
            return new List<Client>()
            {
                new Client
                {
                    ClientName = "xxxxxxxx",
                    ClientId = "f26ee5d6-xxxx-xxxx-xxxx-xxxx0efa43d9.local.app",
                    AllowedGrantTypes = GrantTypes.Code,
                    AllowOfflineAccess = true,
                    IdentityTokenLifetime = 60 * 60 * 24,
                    AccessTokenLifetime = 60 * 60 * 24,
                    RedirectUris = new List<string>()
                    {
                        "https://www.getpostman.com/oauth2/callback"
                    },
                    PostLogoutRedirectUris = new List<string>()
                    {
                        "https://www.getpostman.com"
                    },
                    AllowedCorsOrigins = new List<string>()
                    {
                        "https://www.getpostman.com"
                    },
                    AllowedScopes =
                    {
                        IdentityServerConstants.StandardScopes.OpenId,
                        IdentityServerConstants.StandardScopes.Profile,
                        "xxxxxx",
                    },
                    ClientSecrets = new List<Secret>
                    {
                        new Secret("XXXXXXXX".Sha256())
                    },
                    AllowAccessTokensViaBrowser = true,
                    RequireConsent = false,
                    EnableLocalLogin = true,
                    Enabled = true
                }
             };

        }
    }

Вы, наверное, заметили, что мой config.cs статичен и, вероятно, загружен кодом, который я не могу обработать. Так что я не знаю, как я могу "внедрить" эту конфигурацию здесь.

1 ответ

Решение

Создайте строго типизированную объектную модель, соответствующую вашим настройкам

public class MySettings {
    //Properties here
}

ввести IConfiguration в Startup

private IConfiguration configuration;
public Startup(IConfiguration configuration) {
    this.configuration = configuration;
}

Используйте конфигурацию для привязки к объектной модели и явного внедрения ее в зависимые методы

public void ConfigureServices(IServiceCollection services) {

    MySettings settings = configuration.GetSection("Section_Name_Here").Get<MySettings>();

    services.AddMvc();
    services.AddIdentityServer()
        .AddDeveloperSigningCredential(persistKey: false)
        .AddTestUsers(Config.GetUsers())
        .AddInMemoryIdentityResources(Config.GetIdentityResources())
        .AddInMemoryApiResources(Config.GetApiResources())
        .AddInMemoryClients(Config.GetClients(settings)); //<--
}

Где зависимый метод был бы соответственно подвергнут рефакторингу

public static IEnumerable<Client> GetClients(MySettings settings) {
    return new List<Client>() {
        new Client {
            ClientName = settings.ClientName,

            //...omitted for brevity
Другие вопросы по тегам