本文章介紹下本身這剛實現的一個c#與js交互的插件。需求來源於一次與朋友的討論。主要對話以下:前端
朋友:最近我想模擬一些數據,來測試我如今寫的接口,但手工編寫這些測試數據太麻煩了c#
本人:是啊,.net能生成模擬數據的開源庫的很多吧。不過就咱們搞前端的有個叫Mock.js這方面挺好用的性能
朋友:說來聽聽測試
本人:我就一來二去的把Mock.js的簡單應用和能力說了一通。朋友當即就被個人言語所吸引this
朋友:要不,你來一個spa
本人:這,試試吧.net
說幹就幹,我就開始着手在網上尋找.net能與Js交互的插件,作爲前端的我知道V8引擎在解析Js性能一流,就想用吧。而後就一通的搜索和尋找,終於被我找到。他就是ClearScript。首先來一個設計圖:插件
此接口主要實現三個方法執行方法:設計
ExecuteNoResult:沒有返回值的執行接口code
Execute:執行Js代碼,並接收返回值。其中第二個參數resultKeys作爲須要返回值列表變量名稱集合。
此接口就要規範了一個插件須要的方法,讓一個實體類成爲一插件,對插件的定義:要麼他是有生命週期的(須要手動結束他的生命週期);要麼他對資源消耗比較大(須要才動釋放資源)。
Install:安裝一個插件的方法
UnInstall:卸載一個插件的方法
V8Execute實現的V8引擎執行Js代碼的能力,而V8ExecuteThridPart,他繼承於V8Execute,並實現了插件接口的能力,能夠用於管理。ResultInfo類做爲執行接口的返回基類,主要實現Js代碼的輸出可被.net程序可以使用。這樣就實現了Js的模擬數據回傳給.net。實現代碼以下:
public class V8ExecuteForThirdPart : V8Execute, IPlugin { private IList<string> thirdFilePaths; /// <summary> /// 構造 /// </summary> /// <param name="thridPart"></param> public V8ExecuteForThirdPart(string[] thirdPart) :this(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, thirdPart) { } public V8ExecuteForThirdPart(string prefix, string[] thirdPart) { this.thirdFilePaths = new List<string>(); foreach(var part in thirdPart) { this.thirdFilePaths.Add(System.IO.Path.Combine(prefix, part)); } } public bool Uninstall() { this.Dispose(); return true; } public bool Install() { foreach(var file in this.thirdFilePaths) { string code = this.ReadFile(file); if (string.IsNullOrWhiteSpace(code)) continue; this.ExecuteNonResult(code); } return true; } private string ReadFile(string fileFullPath) { string txt = System.IO.File.ReadAllText(fileFullPath, Encoding.UTF8); return txt; } }
實現代碼以下:
static void Main(string[] args) { string[] jsFiles = { "jsLib\\mock.js" }; SAM.Framework.Plugins.IPlugin plugin = new SAM.JavaScript.V8.V8ExecuteForThirdPart(jsFiles); SAM.Framework.Javascript.IExecute execute = plugin as SAM.Framework.Javascript.IExecute; plugin.Install(); SAM.Framework.Javascript.ResultInfo resultInfo = execute.Execute("\r\n var result=Mock.mock('@email')"); resultInfo = execute.Execute("\r\n var result=result"); Console.WriteLine(resultInfo.Content["result"]); Console.ReadKey(); }
首先加載jsLib下的mock.js文件,此加載在plugin.Install方法被調用實值,而後經過Execute方法進行相關代碼的執行。多個次調用Execute方法,其V8引擎實例引用的是多一個。這也就節省的資源的開銷,以及執行代碼上下文的串聯。
測試代碼下載,此代碼若是沒辦法編譯,若是有須要能夠聯繫本人,主要是這些dll是抽簡出來的,不保證必定能夠運行,後期必定完成一個真實可用的示例。