zoukankan      html  css  js  c++  java
  • asp.net 一般处理程序小优化

    使用asp.net mvc习惯了,最近项目中又开始使用asp.net,有大量的ajax方法调用,之前有两种方法来处理:

    1. Switch case :方法少还行,如果很多,就太蛋疼了,而且方法堆在一块,也不美观
    2. 匿名方法:方法复用不好,vs代码也不便于折叠

    最近研究了一下用反射方法来做,把类中所有公开方法都通过反射找出存到字典中,调用时匹配字典中的key,看是否有此方法。

    以下是我写的方法,这种方法我总结有以下优点:

    1. 不用大量写大量判断语句,简洁
    2. 方法可以复用
    3. 可以集中处理一些事情,如调用前监控,处理;异常处理;...
    4. 如果有不同实现,可以调用不同的接口(虚方法)的实现(我这里为了省事,没有用接口)

    但是我不知道这样写,会不会有性能损耗,是否还有优化的地方,欢迎大家指点。

     1  public class NewServices : IHttpHandler
     2     {
     3         private static readonly IDictionary<string, MethodInfo> Services = new Dictionary<string, MethodInfo>(StringComparer.OrdinalIgnoreCase);
     4 
     5         public void ProcessRequest(HttpContext context)
     6         {
     7             var action = context.Request["action"];
     8             MethodInfo method;
     9             if (action.IsNotNullAndWhiteSpace() && Services.TryGetValue(action, out method))
    10             {
    11                 try
    12                 {
    13                     method.Invoke(new NewServicesApi(context), null);
    14                 }
    15                 catch (Exception ex)
    16                 {
    17                     context.WriteJson(new JsonResultInfo().SetError(ex.Message));
    18                 }
    19             }
    20             else
    21             {
    22                 context.WriteJson(new JsonResultInfo().SetError("{0}方法不存在!".FormatWith(action)));
    23             }
    24         }
    25 
    26         static NewServices()
    27         {
    28             Services.Clear();
    29             var methods = typeof(NewServicesApi).GetMethods(BindingFlags.Public | BindingFlags.Instance);
    30             foreach (var m in methods)
    31             {
    32                 Services.Add(m.Name, m);
    33             }
    34         }
    35         public bool IsReusable { get { return false; } }
    36     }
    37 
    38     internal class NewServicesApi
    39     {
    40         private HttpContext context;
    41         private HttpRequest Request;
    42         private HttpResponse Response;
    43         public NewServicesApi(HttpContext context)
    44         {
    45             this.context = context;
    46             Request = context.Request;
    47             Response = context.Response;
    48         }
    49         public void Test()
    50         {
    51             Response.Write("test");
    52         }
    53     }
  • 相关阅读:
    Linux下安装MySQL5.6
    Linux软件安装管理:rpm与yum
    Linux进程管理
    Linux网络配置
    Linux磁盘分区、挂载
    Django基础之模型层(models.py)、ORM查询之单表查询、多表查询和跨表查询
    Django基础之视图层(views.py)和模板层
    数据的编辑和删除、Django基础之路由层(urls.py)
    小白必会三板斧、静态文件配置、request对象及方法、pycharm和django连接数据库、字段的增删改查和数据的增查
    初识web框架和Django框架
  • 原文地址:https://www.cnblogs.com/lizhanglong/p/3945727.html
Copyright © 2011-2022 走看看