zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    vue学习目录
    充分利用 SQL Server Reporting Services 图表
    MSCRM 用户登录日志
    Microsoft Dynamics CRM MVP
    在SSRS 里实现 SUMIF
    MSCRM 报表显示 rsprocessingaborted 错误
    电商CRM的痛点在哪里?
    MSCRM 2011/2013/2015 修改显示记录数
    MSCRM 2013/2015 Ribbon Editor
    Q:解决每天第一次打开MSCRM系统展示慢的问题
  • 原文地址:https://www.cnblogs.com/happyframework/p/3612830.html
Copyright © 2011-2022 走看看