本文章介紹下自己這剛實現的一個c#與js交互的插件。需求來源於一次與朋友的討論。主要對話如下: 朋友:最近我想模擬一些數據,來測試我現在寫的介面,但手工編寫這些測試數據太麻煩了 本人:是啊,.net能生成模擬數據的開源庫的不少吧。不過就我們搞前端的有個叫Mock.js這方面挺好用的 朋友:說來聽聽 ...
本文章介紹下自己這剛實現的一個c#與js交互的插件。需求來源於一次與朋友的討論。主要對話如下:
朋友:最近我想模擬一些數據,來測試我現在寫的介面,但手工編寫這些測試數據太麻煩了
本人:是啊,.net能生成模擬數據的開源庫的不少吧。不過就我們搞前端的有個叫Mock.js這方面挺好用的
朋友:說來聽聽
本人:我就一來二去的把Mock.js的簡單應用和能力說了一通。朋友立即就被我的言語所吸引
朋友:要不,你來一個
本人:這,試試吧
說乾就乾,我就開始著手在網上尋找.net能與Js交互的插件,做為前端的我知道V8引擎在解析Js性能一流,就想用吧。然後就一通的搜索和尋找,終於被我找到。他就是ClearScript。首先來一個設計圖:
一、介面和實現
1.1 IExecute介面
此介面主要實現三個方法執行方法:
ExecuteNoResult:沒有返回值的執行介面
Execute:執行Js代碼,並接收返回值。其中第二個參數resultKeys做為需要返回值列表變數名稱集合。
1.2 IPlugin介面
此介面就要規範了一個插件需要的方法,讓一個實體類成為一插件,對插件的定義:要麼他是有生命周期的(需要手動結束他的生命周期);要麼他對資源消耗比較大(需要才動釋放資源)。
Install:安裝一個插件的方法
UnInstall:卸載一個插件的方法
1.3 介面的相關實現
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是抽簡出來的,不保證一定可以運行,後期一定完成一個真實可用的示例。