ASP.NET Core实现类库项目读取配置文件
在应用程序目录下添加JSON文件是进行如下配置:
varbuilder=newConfigurationBuilder().SetBasePath(env.ContentRootPath).AddJsonFile("appsettings.json",optional:true,reloadOnChange:true).AddJsonFile($"appsettings.{env.EnvironmentName}.json",optional:true).AddEnvironmentVariables();Configuration=builder.Build();
然后读取配置文件的节点,如下:
publicvoidConfigureServices(IServiceCollectionservices){services.Configure<BlogViewModel>(Configuration.GetSection("JeffckySettings"));......}
但是如果项目是在类库中呢,当然我们也可以将配置值放在应用程序下的appsettings.json中,但是为了不让其json文件中看起来显得非常臃肿同时在类库中的配置数据我们理应放在类库中来统一管理,所以我们得另外再想方案,总不能在类库中建立startup.cs类,再来实例化Configuration吧,这样想想应该也是可以,我没尝试过,难道就没有很简单的方式么,难道就不能像.net core之前用类来读取web.config我们只需要给出键而得到值吗?或者说通过强类型配置来统一管理配置数据,这个才应该是我们尝试的方向。好了,说了这么多,我们就开干。我们首先来复习下.net core中是如何获取应用程序路径的。
.NET Core获取应用程序路径在.NET 4.X之前获取当前应用程序根目录路径和名称可以通过如下获取
varbasePath=AppDomain.CurrentDomain.BaseDirectory;varappName=AppDomain.CurrentDomain.ApplicationIdentity.FullName;
当然也可以通过如下来获取应用程序根目录而不是得到bin目录
Directory.GetCurrentDirectory()
在.net core中获取bin目录路径通过如下来获取更加简洁。
AppContext.BaseDirectory
在.NET 4.X之前获取应用程序集名称通过如下来获取:
Assembly.GetEntryAssembly().GetName().Name;
在.net core中通过如下来获取:
varname=typeof(T).GetTypeInfo().Assembly.GetName().Name;
版本通过如下来获取(.net core也一样):
Assembly.GetEntryAssembly().GetName().Version.ToString()
在类库项目中我们利用强类型配置来实现读取配文件数据,我们首先需要下载如下扩展。
在ConfigurationBuilder类中如下一个Add添加方法:
////摘要://Addsanewconfigurationsource.////参数://source://Theconfigurationsourcetoadd.////返回结果://ThesameMicrosoft.Extensions.Configuration.IConfigurationBuilder.publicIConfigurationBuilderAdd(IConfigurationSourcesource);
对于AddJsonFile扩展方法来添加JSON文件名,文件路径已经通过SetBasePath()方法来实现,一切配置都是基于IConfigurationBuilder接口,其中就有一个JsonConfigurationSource类,实现如下:
////摘要://RepresentsaJSONfileasanMicrosoft.Extensions.Configuration.IConfigurationSource.publicclassJsonConfigurationSource:FileConfigurationSource{publicJsonConfigurationSource();////摘要://BuildstheMicrosoft.Extensions.Configuration.Json.JsonConfigurationProvider//forthissource.////参数://builder://TheMicrosoft.Extensions.Configuration.IConfigurationBuilder.////返回结果://AMicrosoft.Extensions.Configuration.Json.JsonConfigurationProviderpublicoverrideIConfigurationProviderBuild(IConfigurationBuilderbuilder);}
我们再看其父类就有一个添加JSON文件路径的方法,如下:
所以我们从这里可以看出添加JSON文件的方法除了通过扩展方法来实现外还有直接实例化JsonConfigurationSource来实现,如下:
IConfigurationconfig=newConfigurationBuilder().SetBasePath(currentClassDir).AddJsonFile("appsettings.json",false,true).Add(newJsonConfigurationSource{Path="appsettings.json",Optional=false,ReloadOnChange=true}).Build();
上述添加JSON文件皆可,我发现添加JSON文件必须设置JSON文件所在的目录即必须首先要设置SetBasePath方法,否则会报如下错误:
我们搞个测试JSON文件放在当前项目(StudyEFCore.Data)中如下:
最终读取类库项目JSON配置文件,将其封装起来就成了如下这个样子:
publicclassJsonConfigurationHelper{publicTGetAppSettings<T>(stringkey)whereT:class,new(){varbaseDir=AppContext.BaseDirectory;varindexSrc=baseDir.IndexOf("src");varsubToSrc=baseDir.Substring(0,indexSrc);varcurrentClassDir=subToSrc+"src"+Path.DirectorySeparatorChar+"StutdyEFCore.Data";IConfigurationconfig=newConfigurationBuilder().SetBasePath(currentClassDir).Add(newJsonConfigurationSource{Path="appsettings.json",Optional=false,ReloadOnChange=true}).Build();varappconfig=newServiceCollection().AddOptions().Configure<T>(config.GetSection(key)).BuildServiceProvider().GetService<IOptions<T>>().Value;returnappconfig;}}
由上有一个还未解决的问题就是如何得到当前类库项目的路径,没有想到一个好的法子,不知看到此文的你有何高见。简短的调用则是如下:
varconfig=newJsonConfigurationHelper();varperson=config.GetAppSettings<Person>("JeffckySettings");varname=person.Name;varage=person.Age;
结果如下:
我们将其类修改为ConfigurationManager,然后将其GetAppSettings方法定义为静态方法,最后如下调用是不是满足了在.net core之前读取web.config中配置数据的问题。哈哈哈:
varperson=ConfigurationManager.GetAppSettings<Person>("JeffckySettings");
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。