DotNetCore跨平臺~配置文(wen)件(jian)與配置代碼(ma)如何(he)共存
古(gu)人云《一山(shan)不容二虎》,而進行(xing)dotnet core時代(dai)(dai)之后,我們可以(yi)看到(dao)這樣的(de)一些官(guan)方(fang)的(de)DEMO,它將數(shu)據連接串和其(qi)它配置項都直接硬編碼(ma)在(zai)(zai)代(dai)(dai)碼(ma)里(li),即在(zai)(zai)startup中進行(xing)定義,試(shi)問你在(zai)(zai)生產(chan)環境(jing)如何兼(jian)容!當然,你會說(shuo),可以(yi)在(zai)(zai)對應appsettings里(li)進行(xing)配置,說(shuo)它是(shi)對應的(de)appsettings,是(shi)因為(wei)dotnet core下的(de)配置文件有(you)環境(jing)的(de)區分,一般使(shi)用以(yi)下名(ming)稱來表示不同(tong)的(de)環境(jing):
- 開發環境,Development
- 預發布環境,Staging
- 生產環境,Production
對(dui)于二(er)者,配(pei)置(zhi)文件和硬(ying)編碼(ma)配(pei)置(zhi)如何進行(xing)選擇,如果(guo)兩(liang)者都(dou)設置(zhi)了,那(nei)到(dao)底應該(gai)以(yi)誰為(wei)準(zhun)呢?大叔認為(wei),如果(guo)二(er)者都(dou)設置(zhi)了,那(nei)以(yi)配(pei)置(zhi)文件為(wei)準(zhun),當配(pei)置(zhi)文件沒有(you)定義(yi)時(shi),再(zai)以(yi)硬(ying)編碼(ma)配(pei)置(zhi)為(wei)準(zhun),這(zhe)就是他們的(de)優先級,原因(yin)有(you)下面幾點(dian):
- 硬編碼方便在開發環境去調試
- 在指定運行環境后,配置文件根據環境的不同,選擇不同的配置
- 優化級,配置文件 優于 硬編碼
配置文件可能是這樣(Production和Staging環境),一般development不需要配置,直接寫在代碼里就行了,調試方便!

程序(xu)中直接使用(yong)配(pei)置(zhi)可以是這樣(yang)(Development環境)

核心的配置策略實現部分
下面(mian)是(shi)倉儲服(fu)務在注冊(ce)時,選(xuan)擇配(pei)置(zhi)的策略(lve),當(dang)然(ran),你可以把這種邏輯做成一(yi)種裝飾,感(gan)覺更好。
public class EFOptionsExtension : ILindOptionsExtension { private readonly Action<RepositoryOptions> _configure; public EFOptionsExtension(Action<RepositoryOptions> configure) { _configure = configure; } public void AddServices(IServiceCollection services) { var options = new EFOptions(); _configure?.Invoke(options);//裝(zhuang)飾 if (oConfigFileHelper.Get<EFOptions>().ConnString != null) //配(pei)置文(wen)件優先硬編碼 { options.ConnString = ConfigFileHelper.Get<EFOptions>().ConnString; } if (ConfigFileHelper.Get<EFOptions>().DbType != DbType.None) { options.DbType = ConfigFileHelper.Get<EFOptions>().DbType; } services.AddSingleton<ILogger, FileLogger>();//日志 services.AddSingleton(options);//ef配置 services.AddTransient(typeof(DbContext), options.DbContextType);//注冊數據上下文,實(shi)例模式 services.AddTransient(typeof(IRepository<>), typeof(EFRepository<>));//注冊(ce)數據倉儲 } }
在我們進行發(fa)布(bu)之后,一般把dotnet core發(fa)布(bu)到(dao)linux或者直(zhi)接放在docker容器里運行,這時只要設置對(dui)應(ying)的環境變量即可,非常方便!
ENV ASPNETCORE_ENVIRONMENT="Production"
設置完成后(hou),dotnet core會(hui)自己選(xuan)擇對(dui)應的appsettings.Production.json文件(jian)進行加載!
感謝咱們閱讀!