您好,登錄后才能下訂單哦!
本篇內容介紹了“怎么使用ASP.NET Core模仿中間件實現列表過濾功能”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
我們的很多功能當中都會遇到對版本進行過濾的場合,例如你可能需要對列表中的數據的時間進行過濾、版本過濾、渠道以及地區信息進行過濾。
原本的做法:設計很多個過濾方法,通過枚舉的方式組合,選擇需要過濾哪些方法,然后一個方法一個方法的調用。 這樣的做法本身沒什么問題。但是感覺很面向過程,不夠面向對象。
通過學習.Net Core的源碼,我們可以了解到它采用了一種委托鏈表的方式,將所有的中間件都串了起來。所以我想要仿造它這個去實現一下這個功能。
這樣做的好處:抽象出一些過濾的方法,對于不同的系統,只要通過Use方法,就可以增加我們的過濾規則,考慮到不同的系統過濾的規則不同,這樣做也比較靈活(例如 應用管理系統 需要過濾版本、渠道、地區 ,而黑白名單需要過濾版本、渠道、時間等等,那么對于前者我只需要在過濾的時候 UseVersion UserChannel UseArea, 對于后者把UserArea緩存UseTime即可。)
廢話不多說:上碼
1.定義一個委托類型,承載我們過濾方法
namespace FilterDelegate { public delegate IEnumerable<TcySysApplication> TcySysFilterDelegate(IEnumerable<TcySysApplication> applist, TcySysFilterConditionInfo conditionInfo ); }
委托的輸入是我們待處理的數據列表appList, 以及我們執行過濾的條件數據。
2.定義一個Builder類,主要用于構建我們整個過濾器,里面主要有兩個方法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.定義一堆過濾方法,這里沒有寫具體的邏輯,每一個方法都是通過Builder.Use將委托加入到委托鏈中
public static TcySysFilterBuilder UseTimeFilter(this TcySysFilterBuilder builder) { return builder.Use(next => { return (list, filterInfo) => { Console.WriteLine("我是時間過濾"); 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.執行使用
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(); } }
圖上我使用了三種過濾,其中因為Channel中有過濾的邏輯,根據這個邏輯我們應該只會返回一個Channeld = 88215的數據
我們可以將 UseChannelFilter 那句代碼注釋掉,再運行,由于沒有過濾渠道,此時顯示了兩條數據
“怎么使用ASP.NET Core模仿中間件實現列表過濾功能”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。