JavaScript:动态代理之远程代理
背景
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。