<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      歡迎大家下載試用折桂單點登錄系統(tǒng), https://www.zheguisoft.com

      C# 代碼中調(diào)用 Javascript 代碼段以提高應(yīng)用程序的配置靈活性(使用 Javascript .NET 與 Jint)

      一般來說,我們需要在開發(fā)應(yīng)用軟件的配置文件中,添加一些參數(shù),用于后續(xù)用戶根據(jù)實際情況,自行調(diào)整。

      配置參數(shù),可以放在配置文件中、環(huán)境變量中、或數(shù)據(jù)庫表中(如果使用了數(shù)據(jù)庫的話)。通常,配置數(shù)據(jù),以 key/value 的形式。

      有時候,這種  key/value 的形式,不足以滿足用戶需求。比如,系統(tǒng)中有個定時刪除臨時文件的 job ,我們希望在客戶工廠的生產(chǎn)交接班期間及員工吃飯時間,比如客戶工廠生產(chǎn)交接班時間為 5:30 - 6:00 , 23:00-23:30, 中途吃飯時間為 11:00, 4:00。

      也許,可以用正則表達式,來實現(xiàn)以上的功能。但實際情況一調(diào)查,我們發(fā)現(xiàn),客戶用戶懂正則表達式的基本沒有,我們自己公司軟件開發(fā)人員懂正則表達式的也很少。如果做成正則表達式方式,后續(xù)代碼交接之后,能不能維護/修改,也很難說。

      這樣,我們找到了"以 Javascript 的代碼段,進行判斷,作為配置參數(shù)值",這樣可以完美地解決我們的問題。Javascript 基本語法簡單,客戶用戶也可自行更改。

       

      對于可在 C# 代碼中使用的 Javascript 引擎,我們找到了兩個:  Javascript .NET 與 Jint。前者依賴于 Goolge V8 引擎,運行時需要 Microsoft C Runtime Libraries, 后者則是純 C# 代碼組件。

      為同時測試這兩種,我們先進行代碼抽象: 

      Javascript 代碼,可能無 package/namespace ,可能無 function ,只是一段代碼。但無論如何,調(diào)用前賦值、調(diào)用程序、調(diào)用后獲取需要的數(shù)值,這個基本邏輯,是不會變的。

      a. 基礎(chǔ)類定義如下:

       1 using System.Collections.Generic;
       2 
       3 namespace xxxx
       4 {
       5     public interface IJavascriptEngine
       6     {
       7         /// <summary>
       8         /// 執(zhí)行一段 Javascript 代碼,傳入一些參數(shù),得到一些數(shù)值
       9         /// </summary>
      10         /// <param name="strJavascriptCode"></param>
      11         /// <param name="inputParameters"></param>
      12         /// <param name="outputNameValues">傳入時,只填key, 保留 value為空;返回時,填寫value</param>
      13         void Execute(string strJavascriptCode, Dictionary<string, object> inputParameters, Dictionary<string, object> outputNameValues);
      14     }
      15 }

       

      b. Javascript .NET 實現(xiàn)以上接口的代碼如下:

       1 using System.Collections.Generic;
       2 
       3 namespace dispatch_service.srv
       4 {
       5     public class JsNetJavascriptEngineSrv : IJavascriptEngine
       6     {
       7         public virtual void Execute(string strJavascriptCode, Dictionary<string, object> inputParameters, Dictionary<string, object> outputNameValues)
       8         {
       9             using (Noesis.Javascript.JavascriptContext context = new Noesis.Javascript.JavascriptContext())
      10             {
      11                 //step 1, 初始化各個變量值
      12                 foreach (KeyValuePair<string, object> pair in inputParameters)
      13                 {
      14                     context.SetParameter(pair.Key, pair.Value);
      15                 }
      16 
      17                 //step 2, 執(zhí)行 Javascript 代碼,可能是多個函數(shù),或無函數(shù)的代碼段
      18                 context.Run(strJavascriptCode);
      19 
      20                 //step 3, 讀取所需的變量值,暫存到 nonNullKeyValues 變量中。
      21                 Dictionary<string, object> nonNullKeyValues = new Dictionary<string, object>();
      22                 foreach (KeyValuePair<string, object> pair in outputNameValues)
      23                 {
      24                     object value = context.GetParameter(pair.Key);
      25                     if (value != null)
      26                     {
      27                         nonNullKeyValues[pair.Key] = value;
      28                     }
      29                 }
      30 
      31                 //step 4,將暫存的變量值,通過 outputNameValues 返回。
      32                 foreach (KeyValuePair<string, object> pair in nonNullKeyValues)
      33                 {
      34                     outputNameValues[pair.Key] = pair.Value;
      35                 }
      36             }
      37         }
      38     }
      39     
      40 }

       

      c. Jint 實現(xiàn)此接口的代碼如下:

       1 using System.Collections.Generic;
       2 using Jint;
       3 
       4 namespace xxxx
       5 {
       6     public class JintJavascriptEngineSrv : IJavascriptEngine
       7     {
       8         public virtual void Execute(string strJavascriptCode, Dictionary<string, object> inputParameters, Dictionary<string, object> outputNameValues)
       9         {
      10             Engine en = new Engine();
      11            
      12             //step 1, 初始化各個變量值
      13             foreach (KeyValuePair<string, object> pair in inputParameters)
      14             {
      15                 en.SetValue(pair.Key, pair.Value);
      16             }
      17                
      18             //step 2, 執(zhí)行 Javascript 代碼,可能是多個函數(shù),或無函數(shù)的代碼段
      19             en.Execute(strJavascriptCode);
      20 
      21             //step 3, 讀取所需的變量值,暫存到 nonNullKeyValues 變量中。
      22             Dictionary<string, object> nonNullKeyValues = new Dictionary<string, object>();
      23             foreach (KeyValuePair<string, object> pair in outputNameValues)
      24             {
      25                 Jint.Native.JsValue value = en.GetValue(pair.Key);
      26                 if (value != null)
      27                 {
      28                     nonNullKeyValues[pair.Key] = value.ToObject();
      29                 }
      30             }
      31 
      32             //step 4,將暫存的變量值,通過 outputNameValues 返回。
      33             foreach (KeyValuePair<string, object> pair in nonNullKeyValues)
      34             {
      35                 outputNameValues[pair.Key] = pair.Value;
      36             }
      37 
      38         }
      39     }
      40 }

       

      d. 最后,調(diào)用代碼里,可以自由切換以上兩種 Javascript 引擎:

       1                 Dictionary<string, object> inputParameters = new Dictionary<string, object>();
       2                 //給 inputParameters 填充數(shù)值,此處無需填充。
       3 
       4                 Dictionary<string, object> outputNameValues = new Dictionary<string, object>();
       5                 //給 outputNameValues 填充 key 值,此處需得到 canRunNow 變量數(shù)值。
       6                 outputNameValues["canRunNow"] = null;
       7 
       8                 //IJavascriptEngine eng = new JsNetJavascriptEngineSrv();
       9                 IJavascriptEngine eng = new JintJavascriptEngineSrv();
      10 
      11                 eng.Execute(jsStr, inputParameters, outputNameValues);
      12                 object objValue = outputNameValues["canRunNow"];
      13                 System.Nullable<bool> bValue =(System.Nullable<bool>) objValue;
      14                 if (bValue != null && bValue.Value)
      15                 {
      16                     needRunNow = true;
      17                 }

       

      e. 附上 Javascript 代碼段:

      var nowTime=new Date(); var canRunNow = false; var nowHour = nowTime.getHours();  var nowMin = nowTime.getMinutes();  if ( nowHour == 22 && nowMin == 0 ) {canRunNow = true;}

      或:

      var nowTime=new Date(); var canRunNow = false; var nowMin = nowTime.getMinutes(); var nowSec = nowTime.getSeconds(); if ( nowSec % 3 == 0 ) {canRunNow = true;}

      這樣配置就很靈活了。

      當然,這里的 Javascript 代碼段 , 作為配置參數(shù) (key/value 中的 value),我們把它的多個代碼寫成一行。其實,不寫成一行,也是可行的。

       

      -----------------------------------------------------------------------------------------------------------------------

      轉(zhuǎn)發(fā)請注明出處。當心我晚上變大灰狼來摸你肚子喲。我是 jacklondon , at , cnblogs.com. 

      開源項目 velocityweb 維護人。上海折桂軟件有限公司負責人。當前在開發(fā)及推廣折桂打印平臺系統(tǒng)、折桂上傳平臺系統(tǒng)。 http://zheguisoft.com ; http://www.rzrgm.cn/jacklondon ;
      posted @ 2018-07-30 09:51  杰克倫敦塵  Views(3953)  Comments(2)    收藏  舉報
      歡迎大家下載試用折桂單點登錄系統(tǒng), https://www.zheguisoft.com
      主站蜘蛛池模板: 人妻熟妇乱又伦精品无码专区| 亚洲精品香蕉一区二区| 亚洲国产成人综合精品| 又爽又黄又无遮掩的免费视频| 乱码视频午夜在线观看| 国产成人亚洲精品狼色在线| 岛国大片在线免费播放| 怡春院久久国语视频免费| 午夜精品一区二区三区免费视频 | 91老肥熟女九色老女人| 国产精品午夜福利资源| 国产国产午夜福利视频| 亚洲欧美一区二区成人片| 久久经精品久久精品免费观看| 精品久久丝袜熟女一二三| 久久成人国产精品免费软件| 亚洲春色在线视频| 日韩熟女精品一区二区三区| 国产成人亚洲精品日韩激情| 国产精品免费看久久久| 亚洲偷自拍国综合| 成人污视频| 一级做a爰片久久毛片下载| 看亚洲黄色不在线网占| 夜鲁鲁鲁夜夜综合视频| 成人国产一区二区三区精品 | 亚洲爆乳WWW无码专区| 鲁鲁网亚洲站内射污| 久久久久久av无码免费网站| 国产乱人伦av在线无码| 国产亚洲综合区成人国产| 日韩有码中文字幕国产| 自拍偷区亚洲综合第二区| 伊人久在线观看视频| 亚洲中文字幕人成影院| 国产成人永久免费av在线| 一本大道久久香蕉成人网| 亚洲av精选一区二区| 精品亚洲精品日韩精品| 国产高清在线a视频大全| 丰满少妇特黄一区二区三区|