使用C#的Flags特性
举个例子:我有如下的一个需求,当我想要取得用户信息的时候,会先从本地缓存中查找,找不到然后从分布式缓存中查找,最后找不到再从数据库中查询。但是有些场景我又不需要查询数据库。
所以我想建立如下这种模型。
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);