Asp.Net DDD架構(gòu)淺談——網(wǎng)站配置

本系列目錄

Asp.Net DDD架構(gòu)淺談——整體框架說明
Asp.Net DDD架構(gòu)淺談——領(lǐng)域劃分、倉(cāng)儲(chǔ)應(yīng)用、Services層定義
Asp.Net DDD架構(gòu)淺談——圖片上傳、縮略裁剪
Asp.Net DDD架構(gòu)淺談——依賴注入Autofac
Asp.Net DDD架構(gòu)淺談——網(wǎng)站配置

這里的網(wǎng)站配置不是指項(xiàng)目中的Web.config, 在開發(fā)網(wǎng)站的時(shí)候,我們常常用到一些可能會(huì)變動(dòng)的配置類項(xiàng),比如說網(wǎng)站名稱、CopyRight、統(tǒng)計(jì)腳本等等內(nèi)容。
最簡(jiǎn)單的做法是在代碼中寫死,但是不靈活,比如說CopyRight從2017——》2018時(shí),難道我們每個(gè)項(xiàng)目修改一遍,然后重新編譯上傳代碼碼?顯然不行。
那合適的做法是什么呢?用一個(gè)配置的類來管理這些靈活變動(dòng)的值,通過后臺(tái)配置即可。

XML配置

在最開始做項(xiàng)目的時(shí)候,是通過一個(gè)XML的配置文件來記錄這些配置值,如下代碼:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <!--網(wǎng)站信息-->
  <add key="website_name" desc="網(wǎng)站名稱">網(wǎng)站名稱</add>
  <add key="website_url" desc="網(wǎng)站地址">http://localhost:2017</add>
  <add key="website_copyright" desc="網(wǎng)站版權(quán)信息">Copyright?localhost 2018 ICP備xxxxx號(hào)-1</add>
</configuration>

然后通過一個(gè)類來管理這個(gè)XML配置,讀取xml中的key、value數(shù)據(jù),存儲(chǔ)到緩存中,當(dāng)需要修改值時(shí),直接打開xml文件修改對(duì)應(yīng)的地方,或者新增、刪除。

缺點(diǎn)

  • 更新麻煩!至今任然記得每次更新網(wǎng)站,都需要打開兩個(gè)xml文件,一個(gè)是正式環(huán)境的,一個(gè)是測(cè)試的,挨個(gè)比對(duì),去修改,眼睛那個(gè)疼??!
  • 跨網(wǎng)站不好管理,當(dāng)業(yè)務(wù)需要整個(gè)項(xiàng)目拆分為幾個(gè)二級(jí)域名時(shí),這幾個(gè)網(wǎng)站共用一個(gè)xml是很麻煩的。

表配置

通過思考,對(duì)遇到的問題的總結(jié),把存儲(chǔ)從xml轉(zhuǎn)移到表中,而配置(增刪改查)直接通過后臺(tái)來處理。這樣就實(shí)現(xiàn)了簡(jiǎn)單配置的目的。下面來看看如何實(shí)現(xiàn)的。
首先是表定義:

    /// <summary>
    /// 配置表
    /// </summary>
    [Table("SysConfig")]
    public class SysConfig : AggregateRoot
    {
        /// <summary>
        /// 配置Key
        /// </summary>
        public string ConKey { get; set; }

        /// <summary>
        /// 配置值,Json格式
        /// </summary>
        public string ConValue { get; set; }

        /// <summary>
        /// 配置名稱
        /// </summary>
        public string Name { get; set; }

        /// <summary>
        /// 值類型,int、long等
        /// </summary>
        public SysConfigType ConfigType { get; set; }

        /// <summary>
        /// 備注
        /// </summary>
        public string Remark { get; set; }

        /// <summary>
        /// 配置分類:網(wǎng)站配置、上傳配置等
        /// </summary>
        public SysConfigClassify ConfigClassify { get; set; }
    }

注意,我們用ConValue來存儲(chǔ)每個(gè)配置的值,但是配置值有很多種類型,因此這里用Json格式來存儲(chǔ)。
然后是看下SysConfigRepository倉(cāng)儲(chǔ):

        /// <summary>
        /// 網(wǎng)站名稱
        /// </summary>
        public string WebSiteName
        {
            get
            {
                return GetConfig<string>(MethodBase.GetCurrentMethod());
            }
        }

        /// <summary>
        /// 網(wǎng)站CopyRight
        /// </summary>
        public string WebSiteCopyRight
        {
            get
            {
                return GetConfig<string>(MethodBase.GetCurrentMethod());
            }
        }

        public string WebSiteICP
        {
            get
            {
                return GetConfig<string>(MethodBase.GetCurrentMethod());
            }
        }
        /// <summary>
        /// 上傳文件限制
        /// </summary>
        public string[] UploadFileTypes
        {
            get
            {
                return GetConfig<string[]>(MethodBase.GetCurrentMethod());
            }
        }

        /// <summary>
        /// 上傳文件大小限制
        /// </summary>
        public int UploadFileSizes
        {
            get
            {
                return GetConfig<int>(MethodBase.GetCurrentMethod());
            }
        }

我們只要定義屬性即可,都是調(diào)用GetConfig函數(shù)來獲取,來看下GetConfig函數(shù):

        private T GetConfig<T>(MethodBase method)
        {
            try
            {
                var configKey = method.Name;
                if (configKey.StartsWith("get_"))
                {
                    configKey = configKey.Substring(4).Trim();
                }
                else
                {
                    throw new Exception("GetConfig 方法只能在get屬性中調(diào)用!");
                }
                var cacheKey = string.Format(ConfigPatternByKey, configKey);
                var result = Cache.Get<T>(cacheKey, CacheKey, () =>
                {
                    var config = GetByKey(configKey);
                    if (config == null)
                    {
                        var typeName = typeof(T).Name;
                        config = CreateDefaultConfig(typeName, configKey);
                        Save(config);
                    }
                    T cacheResult;
                    if (string.IsNullOrEmpty(config.ConValue))
                    {
                        cacheResult = default(T);
                    }
                    else
                    {
                        cacheResult = JsonConvert.DeserializeObject<T>(config.ConValue);
                    }
                    return cacheResult;
                });
                return result;
            }
            catch (Exception ex)
            {
                Log.Error(ex);
                return default(T);
            }
        }

這里做了一些邏輯處理,首先獲取屬性的名稱,比如說WebSiteName,做為ConKey去緩存中去取對(duì)應(yīng)的值,不存在則在數(shù)據(jù)庫(kù)中查詢,還是不存在,則插入這條數(shù)據(jù),這樣后臺(tái)就可以看到新增的這條配置了。


配置列表

配置項(xiàng)編輯

而調(diào)用的時(shí)候非常簡(jiǎn)單,直接通過ISysConfigRepository的屬性調(diào)用即可。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。