背景

2008 第一次使用 AJAX 的时候好像使用的是 AJAX.NET,该组件支持为服务器 C# 类型提供 JS 代理,当时不是十分的明白。设计模式中有代理模式,不过真正需要我们手工写代理的次数却不多,多数的代理都是动态是生成的,即:动态代理,动态代理的一种应用场景就是:远程代理,本文演示一下 JS 如何实现远程代理的。

远程代理

远程代理的本质是根据元数据自动生成代理类型,就 JS 来说,我们有两种思路生成远程代理:

  1. 服务器根据元数据生成代理。
  2. 服务器提供元数据,JS 根据元数据生成代理。

这里给出第一种方案的简单实现:

代理生成器

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; namespace JsProxyStudy.Controllers
{
public class JsProxyGeneratorController : Controller
{
//
// GET: /JsProxyGenerator/ public ActionResult Index()
{
// 元数据的获取可以采用反射,再利用 Attribute 提供个性化配置和扩展,此处省略。
var metadata = new
{
Controller = "User",
Actions = new[]
{
new
{
Name = "Create",
Params = new []{ "username","password"}
}
}
}; return JavaScript(new Proxy { Metadata = metadata }.TransformText());
}
}
}

测试页面

 <!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<script src="jquery-1.11.0.min.js"></script>
<script src="JsProxyGenerator"></script>
</head>
<body>
</body>
</html>
<script type="text/javascript">
User.Create("shijiucha", "123456", function (result) {
console.log(result);
});
</script>

说明

上面采用 T4 生成的代理,元数据是手工提供的,对于提供反射能力的平台来说,完全可以自动化生成元数据。

备注

其实利用 JS 自己生成远程代理更简单,因为:C# 语言生成 C# 自身的代理需要使用 Emit,非常麻烦,而 JS 生成 JS 的代理就非常简单。这种思路稍微修改一下可以根据服务器元数据,自动生成 UI。还有一种高级的架构模式一般伴随着动态代理,即:管道过滤器模式,利用此模式可以实现一定的 AOP 功能。

完整的代码这里下载:https://happystudy.codeplex.com/SourceControl/latest#JsProxyStudy/JsProxyStudy/Test.html

JavaScript:动态代理之远程代理的更多相关文章

  1. 代理模式(静态代理、JDK动态代理原理分析、CGLIB动态代理)

    代理模式 代理模式是设计模式之一,为一个对象提供一个替身或者占位符以控制对这个对象的访问,它给目标对象提供一个代理对象,由代理对象控制对目标对象的访问. 那么为什么要使用代理模式呢? 1.隔离,客户端 ...

  2. 基于Spring AOP的JDK动态代理和CGLIB代理

    一.AOP的概念  在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的 ...

  3. Java代理模式/静态代理/动态代理

    代理模式:即Proxy Pattern,常用的设计模式之一.代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问. 代理概念 :为某个对象提供一个代理,以控制对这个对象的访问. 代理类和委 ...

  4. Java代理(jdk静态代理、动态代理和cglib动态代理)

    一.代理是Java常用的设计模式,代理类通过调用被代理类的相关方法,并对相关方法进行增强.加入一些非业务性代码,比如事务.日志.报警发邮件等操作. 二.jdk静态代理 1.业务接口 /** * 业务接 ...

  5. [z]Java代理(jdk静态代理、动态代理和cglib动态代理)

    一.代理是Java常用的设计模式,代理类通过调用被代理类的相关方法,并对相关方法进行增强.加入一些非业务性代码,比如事务.日志.报警发邮件等操作. 二.jdk静态代理 1.业务接口 1 2 3 4 5 ...

  6. Atitit 代理CGLIB 动态代理 AspectJ静态代理区别

    Atitit 代理CGLIB 动态代理 AspectJ静态代理区别 1.1. AOP 代理主要分为静态代理和动态代理两大类,静态代理以 AspectJ 为代表:而动态代理则以 spring AOP 为 ...

  7. 【Java】代处理?代理模式 - 静态代理,动态代理

    >不用代理 有时候,我希望在一些方法前后都打印一些日志,于是有了如下代码. 这是一个处理float类型加法的方法,我想在调用它前打印一下参数,调用后打印下计算结果.(至于为什么不直接用+号运算, ...

  8. (转)Java动态代理与CGLib代理

    <br>public class UserDAOImpl{ <br><br>    public void save() { <br>        / ...

  9. java 笔记(3) —— 动态代理,静态代理,cglib代理

    0.代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口. 代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等. 代理类与委托类之间通常会存 ...

随机推荐

  1. Kotlin 语言下设计模式的不同实现

    偶然在 Github 上看到 dbacinski 写的 Kotlin 语言下设计模式的不同实现(这里的不同是相对于 Java 语言的),有些实现非常好,但是有些实现的例子不是很赞同.所以自己写了 Ko ...

  2. 【linux】grep的使用

    最近发现了grep一个超级好用的指令 1. 在当前目录及其子目录中查找所有包含字符串abc的文件及位置 grep -rn "abc" * 2. 查找不包含"abc&quo ...

  3. mysql添加事件

    begin declare debug int; set @debug = 0; if @debug = 1 then insert into task_monitor(info) values('s ...

  4. 3.命名规范《.NET设计规范》

    3.命名规范 3.1 大小写约定 使用合适的大小写增强名字可读性. 3.1.1 标识符的大小写规则 标识符的每个单词首写字幕大写.不要用下划线. PascalCasing camelCasing Pa ...

  5. Error:The supplied javaHome seems to be invalid. I cannot find the java executable. Tried location:

    在Android studio 或者intellij idea中新创建一个项目或者打开一个存在的项目时,有时候会出现Error:The supplied javaHome seems to be in ...

  6. shell学习(三)

    libvirt用于管理KVM本身的工具 virt-install用于安装虚拟机需要的安装包,安装虚拟机 virt-mananger:管理创建删除虚拟机的工具 ---恢复内容开始--- 1    gre ...

  7. 【AtCoder】AGC028 (A-E)题解

    A - Two Abbreviations 如果有最小答案的话这个答案一定是N和M的lcm 我们考虑一下什么情况下 \(k \frac{L}{N} = h \frac{L}{M}\)且\(k,g\)互 ...

  8. 2017 icpc 沈阳 G - Infinite Fraction Path

    题目大意:有n个点, 每个点有一个数字0 - 9, 第 i 个点只能到 第(i * i + 1)个点,问你在哪个点出发走n次构成的数字串最大. 思路:利用求后缀数组的倍增比较思想, 许多细节需要注意. ...

  9. 9-2 The Tower of Babylon uva437 (DP)

    题意:有n种立方体 每种都有无穷多个 要求选一些立方体叠成一根尽量高的柱子  (可以自行选择哪条边为高 )使得每个立方体的底面都严格小于他下方的立方体 为DAG模型 在任何时候 只有顶面的尺寸会影响到 ...

  10. 【LeetCode】65. Valid Number

    Difficulty: Hard  More:[目录]LeetCode Java实现 Description Validate if a given string can be interpreted ...