文章出處

回到目錄

古人云《一山不容二虎》,而進行dotnet core時代之后,我們可以看到這樣的一些官方的DEMO,它將數據連接串和其它配置項都直接硬編碼在代碼里,即在startup中進行定義,試問你在生產環境如何兼容!當然,你會說,可以在對應appsettings里進行配置,說它是對應的appsettings,是因為dotnet core下的配置文件有環境的區分,一般使用以下名稱來表示不同的環境:

  1. 開發環境,Development
  2. 預發布環境,Staging
  3. 生產環境,Production

對于二者,配置文件和硬編碼配置如何進行選擇,如果兩者都設置了,那到底應該以誰為準呢?大叔認為,如果二者都設置了,那以配置文件為準,當配置文件沒有定義時,再以硬編碼配置為準,這就是他們的優先級,原因有下面幾點:

  1. 硬編碼方便在開發環境去調試
  2. 在指定運行環境后,配置文件根據環境的不同,選擇不同的配置
  3. 優化級,配置文件 優于 硬編碼

配置文件可能是這樣(Production和Staging環境),一般development不需要配置,直接寫在代碼里就行了,調試方便!

 程序中直接使用配置可以是這樣(Development環境)

 

核心的配置策略實現部分

下面是倉儲服務在注冊時,選擇配置的策略,當然,你可以把這種邏輯做成一種裝飾,感覺更好。

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);//裝飾
            if (oConfigFileHelper.Get<EFOptions>().ConnString != null) //配置文件優先硬編碼
            {
                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);//注冊數據上下文,實例模式
            services.AddTransient(typeof(IRepository<>), typeof(EFRepository<>));//注冊數據倉儲
        }
    }

在我們進行發布之后,一般把dotnet core發布到linux或者直接放在docker容器里運行,這時只要設置對應的環境變量即可,非常方便!

ENV ASPNETCORE_ENVIRONMENT="Production"

設置完成后,dotnet core會自己選擇對應的appsettings.Production.json文件進行加載!

感謝咱們閱讀!

回到目錄

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()