Как внедрить 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