专栏首页cnblogs简单实现 C# 与 Javascript的兼容

简单实现 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("\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是抽简出来的,不保证一定可以运行,后期一定完成一个真实可用的示例。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • BOOtstrap源码分析之 tooltip、popover

    一、tooltip(提示框) 源码文件: Tooltip.js Tooltip.scss 实现原理: 1、获取当前要显示tooltip的元素的定位信息(top...

    sam dragon
  • 一段奇葩Javascript代码引发的思考

         今天与一挚友加同事调试一段奇葩的javascript代码,在分析出结果后,让我萌生了写此篇文章的想法,如有不对之处望指正,也欢迎大家一起讨论。缩减后的...

    sam dragon
  • 上下div高度动态自适应--另类处理方案

         这段时间在工作中遇到一个看似较为棘手的问题。问题描述:查询报表页面分为上下两部分,上部分为条件输入区域,下部分为报表展示区域。客户要求做到默认满屏(但...

    sam dragon
  • SRv6可编程技术-SRv6 Policy

    胡志波:华为SR与IGP高级协议专家。负责华为的SR与IGP协议规划和创新工作。目前主要从事SR/SRv6协议以及5G切片相关技术的研究。自2017年起积极参与...

    SDNLAB
  • Typecho 文章置顶插件:Sticky

    下载之后建议先解压,将文件夹名字改成Sticky ,然后打包上传到主题目录的/usr/plugins/目录下。

    用户7744319
  • 牛逼!我竟然能在 VS Code 里逛知乎、发文章

    基于 VSCode 的知乎客户端提供包括阅读,搜索,创作,发布等一站式服务,内容加载速度比 Web 端更快,创新的 Markdown-Latex 混合语法让内容...

    GitHubDaily
  • 【Jetbrains】Idea、Phpstorm、Pycharm、Webstorm等激活教程

    JetBrains是一家捷克的软件开发公司,旗下的产品包括但不限于:IntelliJ IDEA、Phpstorm、webstorm、Pycharm等等都是很著名...

    无道
  • TypeScript 交叉类型

    TypeScript 交叉类型是将多个类型合并为一个类型。 这让我们可以把现有的多种类型叠加到一起成为一种类型,它包含了所需的所有类型的特性。

    阿宝哥
  • app端接口用例设计方法和测试方法(一)

    接口测试用例结构要符合实际请求和下发的数据结构,这样方便了解数据结构特点,快速掌握接口数据含义,熟悉接口业务。先介绍请求数据的用例结构

    用户5521279
  • 还在考虑国内游?大数据告诉你出境游才是真会玩

    世界那么大,到底去哪看看?又快到年末,小伙伴们的圣诞游、元旦游是不是又要计划起来了。选择去哪玩呢?还是国内么?NO,据不完全统计,2014年我国出境游人数达到1...

    华章科技

扫码关注云+社区

领取腾讯云代金券