本文章介绍下自己这刚实现的一个c#与js交互的插件。需求来源于一次与朋友的讨论。主要对话如下:
朋友:最近我想模拟一些数据,来测试我现在写的接口,但手工编写这些测试数据太麻烦了
本人:是啊,.net能生成模拟数据的开源库的不少吧。不过就我们搞前端的有个叫Mock.js这方面挺好用的
朋友:说来听听
本人:我就一来二去的把Mock.js的简单应用和能力说了一通。朋友立即就被我的言语所吸引
朋友:要不,你来一个
本人:这,试试吧
说干就干,我就开始着手在网上寻找.net能与Js交互的插件,做为前端的我知道V8引擎在解析Js性能一流,就想用吧。然后就一通的搜索和寻找,终于被我找到。他就是ClearScript。首先来一个设计图:
此接口主要实现三个方法执行方法:
ExecuteNoResult:没有返回值的执行接口
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是抽简出来的,不保证一定可以运行,后期一定完成一个真实可用的示例。