使用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);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM