簡單實現 C# 與 Javascript的兼容

本文章介紹下本身這剛實現的一個c#與js交互的插件。需求來源於一次與朋友的討論。主要對話以下:前端

朋友:最近我想模擬一些數據,來測試我如今寫的接口,但手工編寫這些測試數據太麻煩了c#

本人:是啊,.net能生成模擬數據的開源庫的很多吧。不過就咱們搞前端的有個叫Mock.js這方面挺好用的性能

朋友:說來聽聽測試

本人:我就一來二去的把Mock.js的簡單應用和能力說了一通。朋友當即就被個人言語所吸引this

朋友:要不,你來一個spa

本人:這,試試吧.net

說幹就幹,我就開始着手在網上尋找.net能與Js交互的插件,作爲前端的我知道V8引擎在解析Js性能一流,就想用吧。而後就一通的搜索和尋找,終於被我找到。他就是ClearScript。首先來一個設計圖:插件

1、接口和實現

1.1 IExecute接口

此接口主要實現三個方法執行方法:設計

ExecuteNoResult:沒有返回值的執行接口code

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;
        }
    }

3、測試

實現代碼以下:

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是抽簡出來的,不保證必定能夠運行,後期必定完成一個真實可用的示例。

相關文章
相關標籤/搜索