ارتقاء به ASP.NET Core 1.0 - قسمت 7 - کار با فایلهای config
نویسنده: وحید نصیری
تاریخ: ۱۳۹۵/۰۴/۲۱ ۱۹:۵۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
{
"dependencies": {
//same as before
"Microsoft.Extensions.Configuration.Json": "1.0.0"
}, {
"Key1": "Value1",
"Auth": {
"Users": [ "Test1", "Test2", "Test3" ]
},
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information"
}
}
} <appSettings> <add key="Logging-IncludeScopes" value="false" /> <add key="Logging-Level-Default" value="verbose" /> <add key="Logging-Level-System" value="Information" /> <add key="Logging-Level-Microsoft" value="Information" /> </appSettings>
public class Startup
{
public IConfigurationRoot Configuration { set; get; }
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json");
Configuration = builder.Build();
}
var key1 = Configuration["Key1"];
var user1 = Configuration["Auth:Users:0"];
var authUsers = Configuration.GetSection("Auth:Users").GetChildren().Select(x => x.Value).ToArray();
var loggingIncludeScopes = Configuration["Logging:IncludeScopes"];
var loggingLoggingLogLevelDefault = Configuration["Logging:LogLevel:Default"]; var val = Configuration.GetValue<int>("key-name", defaultValue: 10); public class Startup
{
public IConfigurationRoot Configuration { set; get; } var container = new Container();
container.Configure(config =>
{
config.For<IConfigurationRoot>().Singleton().Use(() => Configuration); public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IConfigurationRoot>(provider => { return Configuration; }); {
"dependencies": {
//same as before
"Microsoft.Extensions.Configuration.Abstractions": "1.0.0"
} public interface IMessagesService
{
string GetSiteName();
}
public class MessagesService : IMessagesService
{
private readonly IConfigurationRoot _configurationRoot;
public MessagesService(IConfigurationRoot configurationRoot)
{
_configurationRoot = configurationRoot;
}
public string GetSiteName()
{
var key1 = _configurationRoot["Key1"];
return $"DNT {key1}";
}
} public void Configure(
IApplicationBuilder app,
IHostingEnvironment env,
IMessagesService messagesService)
{
app.Run(async context =>
{
var siteName = messagesService.GetSiteName();
await context.Response.WriteAsync($"Hello {siteName}");
});
}
var builder = new ConfigurationBuilder()
.AddInMemoryCollection(new[]
{
new KeyValuePair<string,string>("the-key", "the-value"),
}); var theValue = Configuration["the-key"];
public class Startup
{
public IConfigurationRoot Configuration { set; get; }
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddInMemoryCollection(new[]
{
new KeyValuePair<string,string>("the-key", "the-value"),
})
.AddJsonFile("appsettings.json", reloadOnChange: true, optional: false)
.AddJsonFile($"appsettings.{env}.json", optional: true);
Configuration = builder.Build();
} var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
{
"Key1": "Value1",
"Auth": {
"Users": [ "Test1", "Test2", "Test3" ]
},
"Logging": {
"IncludeScopes": false,
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information"
}
},
"Smtp": {
"Server": "0.0.0.1",
"User": "user@company.com",
"Pass": "123456789",
"Port": "25"
}
}
namespace Core1RtmEmptyTest.ViewModels
{
public class SmtpConfig
{
public string Server { get; set; }
public string User { get; set; }
public string Pass { get; set; }
public int Port { get; set; }
}
} {
"dependencies": {
// same as before
"Core1RtmEmptyTest.ViewModels": "1.0.0-*"
},
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.Configure<SmtpConfig>(options => Configuration.GetSection("Smtp").Bind(options)); "dependencies": {
"Core1RtmEmptyTest.ViewModels": "1.0.0-*",
"Microsoft.Extensions.Configuration.Abstractions": "1.0.0",
"Microsoft.Extensions.Options": "1.0.0",
"NETStandard.Library": "1.6.0"
} public interface IMessagesService
{
string GetSiteName();
}
public class MessagesService : IMessagesService
{
private readonly IConfigurationRoot _configurationRoot;
private readonly IOptions<SmtpConfig> _settings;
public MessagesService(IConfigurationRoot configurationRoot, IOptions<SmtpConfig> settings)
{
_configurationRoot = configurationRoot;
_settings = settings;
}
public string GetSiteName()
{
var key1 = _configurationRoot["Key1"];
var server = _settings.Value.Server;
return $"DNT {key1} - {server}";
}
}
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Options;
namespace SampleLib
{
public static class MyServiceCollectionExtensions
{
public static void AddMySampleLib(this IServiceCollection services, SmtpConfig configureOptions)
{
services.TryAddSingleton(Options.Create(configureOptions));
}
}
} public void ConfigureServices(IServiceCollection services)
{
services.AddMySampleLib(new SmtpConfig { /*...*/ }); <Project Sdk="Microsoft.NET.Sdk.Web">
<ItemGroup>
<ProjectReference Include="..\Core1RtmEmptyTest.ViewModels\Core1RtmEmptyTest.ViewModels.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="1.1.1" />
</ItemGroup>
</Project> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard1.6</TargetFramework>
<PackageTargetFallback>$(PackageTargetFallback);dnxcore50</PackageTargetFallback>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Core1RtmEmptyTest.ViewModels\Core1RtmEmptyTest.ViewModels.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="1.1.1" />
<PackageReference Include="Microsoft.Extensions.Options" Version="1.1.1" />
</ItemGroup>
</Project> <PackageReference Include="Microsoft.AspNetCore.App"/>
<PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All"/> public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
} public IConfiguration Configuration { get; }
public Startup(IConfiguration configuration)
{
Configuration = configuration;
} public static void Main(string[] args)
{
BuildWebHost(args).Run();
}
public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build(); public static IWebHost BuildWebHost(string[] args)
{
return WebHost.CreateDefaultBuilder()
.ConfigureAppConfiguration((ctx, cfg) =>
{
cfg.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("config.json", true) // require the json file!
.AddEnvironmentVariables();
})
.ConfigureLogging((ctx, logging) => { }) // No logging
.UseStartup<Startup>()
.Build();
} var host = WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .Build() host.Run();
public static IWebHostBuilder CreateWebHostBuilder(string [] args)
CreateWebHostBuilder(args).Build().Run();
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
} public void ConfigureServices(IServiceCollection services)
{
services.AddOptions<MyOptions>()
.Configure<IHostingEnvironment>((o,env) =>
{
o.Path = env.WebRootPath;
});
} IHostingEnvironment is one of the most annoying interfaces in .NET Core 2.x, because it exists in two different namespaces, Microsoft.AspNetCore.Hosting and Microsoft.Extensions.Hosting . These are slightly different and are incompatible - one does not inherit from the other. public class MySettings
{
public string StringSetting { get; set; }
public int IntSetting { get; set; } public List<string> ListValues { get; } = new List<string>(); public ISet<string> Values { get; set; } public ISet<string> Values { get; } = new HashSet<string>(StringComparer.OrdinalIgnoreCase); public void UpdateSettings(SiteSettings siteSettings)
{
var path = System.IO.Path.Combine(_hostingEnvironment.WebRootPath, "appsettings.json");
System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(path, false);
streamWriter.Write(Newtonsoft.Json.JsonConvert.SerializeObject(siteSettings));
streamWriter.Close();
} private readonly IOptionsSnapshot<SiteSettings> _siteOptions;
public void UpdateSettings(SiteSettings siteSettings)
{
var path = System.IO.Path.Combine(_hostingEnvironment.ContentRootPath, "appsettings.json");
System.IO.File.WriteAllText(path, Newtonsoft.Json.JsonConvert.SerializeObject(siteSettings,Newtonsoft.Json.Formatting.Indented));
} "CustomConfig": {
"Setting1": "Hello",
"Setting2": "Hello"
} public class CustomConfig
{
[Required(ErrorMessage = "Custom Error Message")]
public string Setting1 { get; set; }
public string Setting2 { get; set; }
public string Setting3 { get; set; }
} namespace MvcTest
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddOptions<CustomConfig>()
.Bind(Configuration.GetSection("CustomConfig"))
.ValidateDataAnnotations();
} namespace MvcHealthCheckTest
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddOptions<CustomConfig>()
.Bind(Configuration.GetSection("CustomConfig"))
.ValidateDataAnnotations()
.Validate(customConfig =>
{
if (customConfig.Setting2 != default)
{
return customConfig.Setting3 != default;
}
return true;
}, "Setting 3 is required when Setting2 is present");
} services.AddConfig<MySettings>(Configuration.GetSection("MySettings")); public static class ServiceCollectionExtensions
{
public static TSettings AddConfig<TSettings>(this IServiceCollection services, IConfiguration configuration)
where TSettings : class, new()
{
return services.AddConfig<TSettings>(configuration, options => { });
}
public static TSettings AddConfig<TSettings>(this IServiceCollection services, IConfiguration configuration, Action<BinderOptions> configureOptions)
where TSettings : class, new()
{
if (services == null) { throw new ArgumentNullException(nameof(services)); }
if (configuration == null) { throw new ArgumentNullException(nameof(configuration)); }
TSettings setting = configuration.Get<TSettings>(configureOptions);
services.TryAddSingleton(setting);
return setting;
}
} private readonly MySettings _settings;
public MyViewComponent(MySettings settings)
{
_settings = settings;
} //services.TryAddSingleton(setting); services.TryAddScoped(cfg => cfg.GetService<IOptionsSnapshot<TSettings>>().Value);
"SiteSettingsA": {
"DefaultUserPicture": "http://site.com/users/defaultavatar.png"
},
"SiteSettingsB": {
"DefaultUserPicture": "http://site.com/users/defaultavatar2.png"
} public class SiteSettings
{
public string DefaultUserPicture { get; set; }
} services.Configure<SiteSettings>("FirstSettings", Configuration.GetSection("SiteSettingsA"));
services.Configure<SiteSettings>("SecondSettings", Configuration.GetSection("SiteSettingsB")); private readonly SiteSettings _firstSiteSettings;
private readonly SiteSettings _secondSiteSettings;
public HomeController(IOptionsSnapshot<SiteSettings> siteSettings)
{
_firstSiteSettings = siteSettings.Get("FirstSettings");
_secondSiteSettings = siteSettings.Get("SecondSettings");
} IHost host = Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, configuration) =>
{
configuration.Sources.Clear();
IHostEnvironment env = hostingContext.HostingEnvironment;
configuration
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
//.AddJsonFile($"appsettings.{env.EnvironmentName}.json", true, true);
IConfigurationRoot configurationRoot = configuration.Build();
})
.ConfigureServices((hostContext, services) =>
{
services.Configure<SiteSettings>(options => hostContext.Configuration.Bind(options)); "WaitForExit": "0.00:02:00.0000"
"1.02:03:04" is 1 day, 2 hours, 3 mins, 4 seconds