简简单单完毕 C# 与 Javascript的合作

本小说介绍下自己那刚完成的一个c#与js交互的插件。要求来源一回与情人的座谈。首要对话如下:

对象:近日本身想效仿一些数额,来测试自己现在写的接口,但手工编制这么些测试数据太难为了

本身:是啊,.net能生成模仿数据的开源库的成百上千啊。不过就我们搞前端的有个叫Mock.js这上面挺好用的

情侣:说来听听

本身:我就一来二去的把Mock.js的简单利用和能力说了一通。朋友及时就被我的讲话所吸引

对象:要不,你来一个

本人:这,试试吧

说干就干,我就起来入手在网上寻找.net能与Js交互的插件,做为前端的自己精通V8引擎在解析Js品质一流,就想用吧。然后就一通的追寻和搜索,终于被自己找到。他就是ClearScript。首先来一个企划图:

图片 1

一、接口和贯彻

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是抽简出来的,不保障一定可以运行,后期一定做到一个真正可用的演示。

相关文章