配置文件里一般存储一些不变的信息 功能和web.config里的appSettings相同
Core里以DI为主 所以不能直接读配置文件 以依赖注入的方式获取
添加配置文件
配置文件加入到配置信息中
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.SetBasePath(Directory.GetCurrentDirectory());
config.AddInMemoryCollection(arrayDict);
config.AddJsonFile(
"json_array.json", optional: false, reloadOnChange: false);
config.AddJsonFile(
"starship.json", optional: false, reloadOnChange: false);
config.AddXmlFile(
"tvshow.xml", optional: false, reloadOnChange: false);
config.AddEFConfiguration(
options => options.UseInMemoryDatabase("InMemoryDb"));
config.AddCommandLine(args);
})
.UseStartup<Startup>();
初始化实例并配置映射
services.AddOptions();
services.Configure<ConfigSetting>(Configuration.GetSection("BookstoreDatabaseSettings"));
services.Configure<List<ConfigSetting>>(Configuration.GetSection("RoleList"));
使用
public class GetConfig
{
//获取配置信息使用 GetSection
private readonly IOptions<ConfigSetting> options;
private readonly IConfiguration configuration;
private readonly IOptions<List<ConfigSetting>> optionsList;
public GetConfig(IOptions<ConfigSetting> options, IConfiguration configuration,IOptions<List<ConfigSetting>> optionsList) {
this.options = options;
this.configuration = configuration;
this.optionsList = optionsList;
}
/// <summary>
/// 获取单个实体
/// </summary>
/// <returns></returns>
public ConfigSetting Get() {
return options.Value;
}
/// <summary>
/// 获取单一字符串
/// </summary>
/// <returns></returns>
public string Get1() {
return configuration.GetSection("StrSetting").Value;
}
/// <summary>
/// 获取自定义配置
/// </summary>
/// <returns></returns>
public string Get2() {
return configuration.GetSection("array:entries:0").Value;
}
/// <summary>
/// 获取集合
/// </summary>
/// <returns></returns>
public List<ConfigSetting> GetList()
{
return optionsList.Value;
}
}
方法加入到服务
services.AddScoped<GetConfig>();
使用
public class IndexModel : PageModel
{
private GetConfig getConfig { get; set; }
public IndexModel( GetConfig getConfig) {
this.getConfig = getConfig;
}
public JsonResult OnGet()
{
return new JsonResult(getConfig.GetList());
}
}
自定义配置
public static Dictionary<string, string> arrayDict =
new Dictionary<string, string>
{
{"array:entries:0", "value0"},
{"array:entries:1", "value1"},
{"array:entries:2", "value2"},
{"array:entries:4", "value4"},
{"array:entries:5", "value5"}
};
json文件
配置EF
在添加自定义配置时有这样一个添加方法
config.AddEFConfiguration(
options => options.UseInMemoryDatabase("InMemoryDb"));
这个就是添加EF配置信息的
EF拓展
数据库实体(表)
public class EFConfigurationValue
{
public string Id { get; set; }
public string Value { get; set; }
}
上下文
public class EFConfigurationContext : DbContext
{
public EFConfigurationContext(DbContextOptions options) : base(options)
{
}
public DbSet<EFConfigurationValue> Values { get; set; }
}
默认数据库信息
public class EFConfigurationProvider : ConfigurationProvider
{
public EFConfigurationProvider(Action<DbContextOptionsBuilder> optionsAction)
{
OptionsAction = optionsAction;
}
Action<DbContextOptionsBuilder> OptionsAction { get; }
// Load config data from EF DB.
public override void Load()
{
var builder = new DbContextOptionsBuilder<EFConfigurationContext>();
OptionsAction(builder);
using (var dbContext = new EFConfigurationContext(builder.Options))
{
dbContext.Database.EnsureCreated();
Data = !dbContext.Values.Any()
? CreateAndSaveDefaultValues(dbContext)
: dbContext.Values.ToDictionary(c => c.Id, c => c.Value);
}
}
private static IDictionary<string, string> CreateAndSaveDefaultValues(
EFConfigurationContext dbContext)
{
// Quotes (c)2005 Universal Pictures: Serenity
// https://www.uphe.com/movies/serenity
var configValues = new Dictionary<string, string>
{
{ "quote1", "I aim to misbehave." },
{ "quote2", "I swallowed a bug." },
{ "quote3", "You can't stop the signal, Mal." }
};
dbContext.Values.AddRange(configValues
.Select(kvp => new EFConfigurationValue
{
Id = kvp.Key,
Value = kvp.Value
})
.ToArray());
dbContext.SaveChanges();
return configValues;
}
}
委托绑定
public class EFConfigurationSource : IConfigurationSource
{
private readonly Action<DbContextOptionsBuilder> _optionsAction;
public EFConfigurationSource(Action<DbContextOptionsBuilder> optionsAction)
{
_optionsAction = optionsAction;
}
public IConfigurationProvider Build(IConfigurationBuilder builder)
{
return new EFConfigurationProvider(_optionsAction);
}
}
新建AddEFConfiguration方法
public static class EntityFrameworkExtensions
{
public static IConfigurationBuilder AddEFConfiguration(
this IConfigurationBuilder builder,
Action<DbContextOptionsBuilder> optionsAction)
{
return builder.Add(new EFConfigurationSource(optionsAction));
}
}
使用
config.AddEFConfiguration(
options => options.UseInMemoryDatabase("InMemoryDb"));