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

原文地址:https://www.cnblogs.com/happyframework/p/3612830.html