舉個例子:我有如下的一個需求,當我想要取得用戶信息的時候,會先從本地緩存中查找,找不到然后從分布式緩存中查找,最后找不到再從數據庫中查詢。但是有些場景我又不需要查詢數據庫。
所以我想建立如下這種模型。
public UserEntity GetUserInfo(List<DataSource> dataSources)
{
var xxxx = new UserEntity();
if(dataSources.Any(DataSource.Local)
{
//從本地緩存中獲取
return xxxx;
}
if(dataSources.Any(DataSource.Distribution)
{
//從分布式緩存中獲取
//更新本地緩存
return xxxx;
}
if(dataSources.Any(DataSource.DB)
{
//從DB中獲取
//更新分布式緩存
//更新本地緩存
}
return xxxx;
}
但是每次調用者都去構建一個List,比較麻煩,此時我們可以使用枚舉中的Flags特性,修改程序如下:
首先是枚舉的定義上,要加上 [Flags] 特性標簽,並且定義 一般都是 2的n次方,主要是便於位移運算
/// <summary>
/// 數據取得地方
/// </summary>
[Flags]
public enum DataSource
{
/// <summary>
/// 本地緩存
/// </summary>
[Description("本地緩存")]
LocalCache = 1,
/// <summary>
/// 分布式緩存
/// </summary>
[Description("分布式緩存")]
DistributeCache = 2,
/// <summary>
/// 數據庫
/// </summary>
[Description("數據庫")]
DB = 4,
}
修改代碼:
public UserEntity GetUserInfo(DataSource dataSources)
{
var xxxx = new UserEntity();
if(dataSources.HasFlags(DataSource.Local)
{
//從本地緩存中獲取
return xxxx;
}
if(dataSources.HasFlags(DataSource.Distribution)
{
//從分布式緩存中獲取
//更新本地緩存
return xxxx;
}
if(dataSources.HasFlags(DataSource.DB)
{
//從DB中獲取
//更新分布式緩存
//更新本地緩存
}
return xxxx;
}
調用的地方,可以通過“|”來指定,例如我只想用分布式緩存和數據庫,那么:
var userInfo = GetUserInfo(DataSource.Distribution | DataSource.DB);
