简单实现 C# 与 Javascript的兼容
本文章介绍下自己这刚实现的一个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("rn var result=Mock.mock('@email')");
resultInfo = execute.Execute("rn var result=result");
Console.WriteLine(resultInfo.Content["result"]);
Console.ReadKey();
}
首先加载jsLib下的mock.js文件,此加载在plugin.Install方法被调用实值,然后通过Execute方法进行相关代码的执行。多个次调用Execute方法,其V8引擎实例引用的是多一个。这也就节省的资源的开销,以及执行代码上下文的串联。
测试代码下载,此代码如果没办法编译,如果有需要可以联系本人,主要是这些dll是抽简出来的,不保证一定可以运行,后期一定完成一个真实可用的示例。
- ANR 原理与实战技巧
- Android将应用程序的崩溃信息如何保存到本地文件,并上传至服务器
- android native内存检测方案(二)
- 测试数据集与验证数据集之间有什么区别呢?
- 深度学习的未来
- SDL系列讲解(二) 环境搭建
- SDL系列讲解(四) demo讲解
- 具有张量流的混合密度网络
- SDL系列讲解(七) SDL_image教程
- SDL系列讲解(八) SDL_ttf教程
- 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](五)
- 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](六)
- android SDL系列讲解(十三) 播放音乐库 SDL_mixer教程
- android am 命令简单讲解(一)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- SAP Spartacus CmsService的CmsActions.LoadCmsComponent
- SAP Spartacus OccEndpointsService单元测试的依赖注入
- Python利用PyPDF2库获取PDF文件总页码实例
- TypeScript里get属性的实现
- SAP Spartacus OccEndpointsService单元测试之getBaseEndpoint
- html+css入门基础案例之圣诞那些事
- 建议收藏备查!MySQL 常见错误代码说明
- html+css入门基础案例之页面设计
- Github 星标 8K+ 这款国人开源的 Redis 可视化管理工具,真香...
- CSS3 2D转换
- CSS3 3D转换
- python传到前端的数据,双引号被转义的问题
- H5C3综合案例
- 移动web开发之rem适配布局
- Android面试题问答整理