• 简单实现 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("
     var result=Mock.mock('@email')");
                resultInfo = execute.Execute("
     var result=result");
                Console.WriteLine(resultInfo.Content["result"]);
                Console.ReadKey();
            }

         首先加载jsLib下的mock.js文件,此加载在plugin.Install方法被调用实值,然后通过Execute方法进行相关代码的执行。多个次调用Execute方法,其V8引擎实例引用的是多一个。这也就节省的资源的开销,以及执行代码上下文的串联。

    测试代码下载,此代码如果没办法编译,如果有需要可以联系本人,主要是这些dll是抽简出来的,不保证一定可以运行,后期一定完成一个真实可用的示例。

  • 相关阅读:
    2016-8-29
    2016-8-25
    2016-8-24
    2016-8-23
    2016-8-22
    2016-8-16
    2016-8-15
    深圳_多测师面试 __腾讯云/_高级讲师肖sir
    深圳_多测师面试 _新字节跳动(2020年10月23日)_高级讲师肖sir
    多测师讲解自动化 _RF_(202)高级讲师肖sir
  • 原文地址:https://www.cnblogs.com/cqhaibin/p/7861774.html
Copyright © 2020-2023  润新知