溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么使用ASP.NET?Core模仿中間件實(shí)現(xiàn)列表過濾功能

發(fā)布時(shí)間:2022-07-27 11:36:21 來源:億速云 閱讀:135 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“怎么使用ASP.NET Core模仿中間件實(shí)現(xiàn)列表過濾功能”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

我們的很多功能當(dāng)中都會(huì)遇到對版本進(jìn)行過濾的場合,例如你可能需要對列表中的數(shù)據(jù)的時(shí)間進(jìn)行過濾、版本過濾、渠道以及地區(qū)信息進(jìn)行過濾。

原本的做法:設(shè)計(jì)很多個(gè)過濾方法,通過枚舉的方式組合,選擇需要過濾哪些方法,然后一個(gè)方法一個(gè)方法的調(diào)用。 這樣的做法本身沒什么問題。但是感覺很面向過程,不夠面向?qū)ο蟆?/p>

怎么使用ASP.NET?Core模仿中間件實(shí)現(xiàn)列表過濾功能

通過學(xué)習(xí).Net Core的源碼,我們可以了解到它采用了一種委托鏈表的方式,將所有的中間件都串了起來。所以我想要仿造它這個(gè)去實(shí)現(xiàn)一下這個(gè)功能。

這樣做的好處:抽象出一些過濾的方法,對于不同的系統(tǒng),只要通過Use方法,就可以增加我們的過濾規(guī)則,考慮到不同的系統(tǒng)過濾的規(guī)則不同,這樣做也比較靈活(例如 應(yīng)用管理系統(tǒng) 需要過濾版本、渠道、地區(qū) ,而黑白名單需要過濾版本、渠道、時(shí)間等等,那么對于前者我只需要在過濾的時(shí)候 UseVersion UserChannel UseArea, 對于后者把UserArea緩存UseTime即可。)

廢話不多說:上碼

1.定義一個(gè)委托類型,承載我們過濾方法

namespace FilterDelegate
{
      public delegate IEnumerable<TcySysApplication> TcySysFilterDelegate(IEnumerable<TcySysApplication> applist, TcySysFilterConditionInfo conditionInfo );
}

委托的輸入是我們待處理的數(shù)據(jù)列表appList, 以及我們執(zhí)行過濾的條件數(shù)據(jù)。

2.定義一個(gè)Builder類,主要用于構(gòu)建我們整個(gè)過濾器,里面主要有兩個(gè)方法Use方法以及Build方法,Use方法主要用于往我們的委托列表里面增加過濾委托,Build方法主要用于生成最后的過濾器

private readonly IList<Func<TcySysFilterDelegate, TcySysFilterDelegate>> _components = new List<Func<TcySysFilterDelegate, TcySysFilterDelegate>>();
 
public TcySysFilterBuilder()
{
 
}
 
public TcySysFilterBuilder Use(Func<TcySysFilterDelegate, TcySysFilterDelegate> filterItem)
{
    _components.Add(filterItem);
    return this;
}
 
public TcySysFilterDelegate Build()
{
    TcySysFilterDelegate last = (applist,filterInfo) =>
    {
        Console.WriteLine("過濾完成");
        return applist;
    };
 
    foreach (var component in _components.Reverse())
    {
        last = component(last);
    }
 
    return last;
}

3.定義一堆過濾方法,這里沒有寫具體的邏輯,每一個(gè)方法都是通過Builder.Use將委托加入到委托鏈中

public static TcySysFilterBuilder UseTimeFilter(this TcySysFilterBuilder builder)
{
    return builder.Use(next =>
    {
        return (list, filterInfo) =>
        {
            Console.WriteLine("我是時(shí)間過濾");
            return next(list, filterInfo);
        };
    });
}
 
 
public static TcySysFilterBuilder UseChannelFilter(this TcySysFilterBuilder builder)
{
    return builder.Use(next =>
    {
        return (list, filterInfo) =>
        {
            Console.WriteLine("我是渠道過濾");
 
            list = list.Where(x => x.ChannelId != filterInfo.ChannelId);
 
            return next(list, filterInfo);
        };
    });
}
 
public static TcySysFilterBuilder UseVersionFilter(this TcySysFilterBuilder builder)
{
    return builder.Use(next =>
    {
        return (list, filterInfo) =>
        {
            Console.WriteLine("我是版本過濾");
            return next(list, filterInfo);
        };
    });
}

4.其他類型

public class TcySysApplication
{
    public long AppId { set; get; }
    public string Name { set; get; }
    public long ChannelId { set; get; }
    public long Version { set; get; }
    public string Province { set; get; }
    public string City { set; get; }
    public string District { set; get; }
}
 
public class TcySysFilterConditionInfo
{
    public long ChannelId { set; get; }
    public long Version { set; get; }
    public string Province { set; get; }
    public string City { set; get; }
    public string District { set; get; }
}

5.執(zhí)行使用

class Program
{
    static void Main(string[] args)
    {
        var sourceList = new List<TcySysApplication>();
 
        sourceList.Add(new TcySysApplication {
            AppId =1000,
            ChannelId = 88215,
            District = "",
            City = "烏魯木齊",
            Province = "新疆",
            Name ="愛玩不玩",
            Version = 10001
        });
 
        sourceList.Add(new TcySysApplication
        {
            AppId = 1001,
            ChannelId = 310200,
            District = "",
            City = "烏魯木齊",
            Province = "新疆",
            Name = "愛玩不玩2",
            Version = 10002
        });
 
 
        var filterInfo = new TcySysFilterConditionInfo
        {
            ChannelId = 310200,
            District = "",
            City = "北京",
            Province = "北京",
            Version = 10002
        };
 
 
        var builder = new TcySysFilterBuilder();
 
        builder.UseTimeFilter()
            .UseChannelFilter()
            .UseVersionFilter();
 
        var filter = builder.Build();
 
        var result = filter(sourceList, filterInfo);
 
 
        foreach (var item in result)
        {
            Console.WriteLine($"AppId={item.AppId} AppName={item.Name} ChannelId={item.ChannelId}");
        }
 
        Console.ReadKey();
    }
}

圖上我使用了三種過濾,其中因?yàn)镃hannel中有過濾的邏輯,根據(jù)這個(gè)邏輯我們應(yīng)該只會(huì)返回一個(gè)Channeld = 88215的數(shù)據(jù)

怎么使用ASP.NET?Core模仿中間件實(shí)現(xiàn)列表過濾功能

我們可以將 UseChannelFilter 那句代碼注釋掉,再運(yùn)行,由于沒有過濾渠道,此時(shí)顯示了兩條數(shù)據(jù)

怎么使用ASP.NET?Core模仿中間件實(shí)現(xiàn)列表過濾功能

“怎么使用ASP.NET Core模仿中間件實(shí)現(xiàn)列表過濾功能”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI