Natasha v2.5.4 版与运行时实战
文章轉載授權級別:B
Natasha 是一個十分便捷的動態構建庫,支持.NET Standard2.0 / Core3.0+ ; 比起繁雜的 IL 指令和 Expression 的眾多 API , ?Natasha 的構建方式更加友好簡潔,?基于 Natasha 可以讓動態工作變得傻瓜,簡單,讓開發者更加專注動態代碼的邏輯。?在上一篇動態查找樹的文章中,我們使用算法結合 Natasha 將字典的性能提升了一倍且支持并發,在性能優化上面取得了比較顯著的成效。
下面將寫一些入門的操作,希望更多的開發者能參與進來,一起提升和體驗 Natasha (項目地址:https://github.com/dotnetcore/Natasha);
場景1:在程序運行時,通過外面傳來的字符串,創建一個委托,并且可以回收。
string?input = @"return arg1+arg2;";//先創建域再創建委托var?func?=?NDomain????????????.Create("MyDomain")???//域名為MyDomain的獨立域 .Func<string, string,?string>(input);var?result?=?func("Hello","?World!");//result: Hello World!
//卸載獨立域 - 回收func.Delete();
場景2:在程序運行時,通過字符串創建一個類/結構體/枚舉/接口。
場景3:測試一個復雜的應用場景。
步驟:
??? 1、在系統域內創建一個類A,包括一個靜態方法 B。
??? 2、在 B 方法中實現 try/catch。
??? 3、在 B 方法中調用 SqlConnection/Json.net 等依賴庫操作。
??? 4、在 B 方法中調用當前不同命名空間的類。
??? 5、返回一個結果。
? ? 6、在獨立域創建一個靜態類及方法,并返回剛才創建的系統域的 A.B 方法。
?var?type?=?NClass.Create()??//Create參數為空時,使用系統域? .Public .Namespace("OperatorOverride")?????????????.OopName("Test1")???//類名為Test1 .OopBody(@" public static string GetTest(){ try { System.Data.SqlClient.SqlConnection client = new System.Data.SqlClient.SqlConnection(); client.Open(); SqlCommand cmd = client.CreateCommand(); SqlDataReader read = cmd.ExecuteReader();????????????????return?""succeed!""; } catch (Exception ex) { Test2 test = new Test2(); test.Error = new Model2.Test3(); test.Error.Name = ex.Message;?????????????????return?JsonConvert.SerializeObject(test);
????????????}}")????????????.GetType();
//在隨機域中返回剛剛創建的方法var?func =?NDomain.Random()???????????.Func<Func<string>>("return?Test1.GetTest;")
var?GetTest?=?func();Console.WriteLine(GetTest());
//結果:{"Error":{"Name":"The ConnectionString property has not been initialized."}}
場景4:針對 TryHandler類?構建一個可以自定義的處理流程,我們項目的需求變更十分頻繁,在需求穩定之前我們不得不進行大量的調試和試錯,希望有這么一個系統能再不重啟的情況下支持我們折騰。
控制約束類:
??//獲取產品??public?static?Func<T, Product>?GetProductEntity;??//寫入數據庫??public?static Func<Product, bool>?WriteProduct;??//日志放到隊列里??public?static?Func<bool, Product, bool>?SendLogToQueue;??//這里是入口??public?static?Func<T, bool>?Hanlder;
}
腳本擴展類:
}
準備好寫在外面需要傳入的腳本,這里用 txt 文件代替,如圖:
如果看不清圖:主要的輸出是將產品序列化到 1.txt 中,并在屏幕上打印?成功或者失敗。
在入口函數:
foreach (var item in files){????//讀腳本并讓其生效????ScriptHandler.Handler(File.ReadAllText(item));}Apple apple = new Apple();apple.AppleId = 10;apple.AppleName = "蘋果";
TryHandler<Apple>.Hanlder(apple);
執行結果:
{"Id":10,"Name":"蘋果"}最新版 Natasha 有了什么變化:
Natasha 所有 API 將以域為首要條件,如果使用 FastMethod / FakeMethod / Oop 等 Operator 時將默認提供三種靜態實例方法:Create / Random 方便用戶創建域 / 使用系統域?/?使用隨機域等。
Natahsha 最新版支持命名空間引用的覆蓋,增加了 CS0104 / CS0234 / CS0246 等問題處理方案,在出現二義性引用時優先使用開發者傳入 Using 的命名空間,針對命名空間無效的情況,Natasha 將在第一次編譯時進行過濾移除并進行第二次編譯,命名空間的處理對開發者盡可能透明。
https://github.com/dotnetcore
打賞一杯酒,削減三分愁。
跟著我們走,脫發包你有。
組織打賞賬戶為檸檬的賬戶,請標注「NCC」,并留下您的名字,以下地址可查看收支明細:https://github.com/dotnetcore/Home/blob/master/Statement-of-Income-and-Expense.md
OpenNCC,專注.NET技術的公眾號
https://www.dotnetcore.xyz
微信ID:OpenNCC
長按左側二維碼關注
歡迎打賞組織
給予我們更多的支持
總結
以上是生活随笔為你收集整理的Natasha v2.5.4 版与运行时实战的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何运用DDD - 实体
- 下一篇: .Net Core3.1下使用Swagg