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