JavaScript:動態代理之遠程代理


背景

2008 第一次使用 AJAX 的時候好像使用的是 AJAX.NET,該組件支持為服務器 C# 類型提供 JS 代理,當時不是十分的明白。設計模式中有代理模式,不過真正需要我們手工寫代理的次數卻不多,多數的代理都是動態是生成的,即:動態代理,動態代理的一種應用場景就是:遠程代理,本文演示一下 JS 如何實現遠程代理的。

遠程代理

遠程代理的本質是根據元數據自動生成代理類型,就 JS 來說,我們有兩種思路生成遠程代理:

  1. 服務器根據元數據生成代理。
  2. 服務器提供元數據,JS 根據元數據生成代理。

這里給出第一種方案的簡單實現:

代理生成器

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 using System.Web.Mvc;
 6 
 7 namespace JsProxyStudy.Controllers
 8 {
 9     public class JsProxyGeneratorController : Controller
10     {
11         //
12         // GET: /JsProxyGenerator/
13 
14         public ActionResult Index()
15         {
16             // 元數據的獲取可以采用反射,再利用 Attribute 提供個性化配置和擴展,此處省略。
17             var metadata = new
18             {
19                 Controller = "User",
20                 Actions = new[]
21                 {
22                     new
23                     {
24                         Name = "Create",
25                         Params = new []{ "username","password"}
26                     }    
27                 }
28             };
29 
30             return JavaScript(new Proxy { Metadata = metadata }.TransformText());
31         }
32     }
33 }

測試頁面

 1 <!DOCTYPE html>
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 5     <title></title>
 6     <script src="jquery-1.11.0.min.js"></script>
 7     <script src="JsProxyGenerator"></script>
 8 </head>
 9 <body>
10 </body>
11 </html>
12 <script type="text/javascript">
13     User.Create("shijiucha", "123456", function (result) {
14         console.log(result);
15     });
16 </script>

說明

上面采用 T4 生成的代理,元數據是手工提供的,對於提供反射能力的平台來說,完全可以自動化生成元數據。

備注

其實利用 JS 自己生成遠程代理更簡單,因為:C# 語言生成 C# 自身的代理需要使用 Emit,非常麻煩,而 JS 生成 JS 的代理就非常簡單。這種思路稍微修改一下可以根據服務器元數據,自動生成 UI。還有一種高級的架構模式一般伴隨着動態代理,即:管道過濾器模式,利用此模式可以實現一定的 AOP 功能。

完整的代碼這里下載:https://happystudy.codeplex.com/SourceControl/latest#JsProxyStudy/JsProxyStudy/Test.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM