本系列目錄
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)就可以看到新增的這條配置了。
而調(diào)用的時(shí)候非常簡(jiǎn)單,直接通過ISysConfigRepository的屬性調(diào)用即可。