• 委托应用实例


    需求:根据传入的action参数,自动构造与之对应的request。

    直接上代码。

    先定义一个MyRequest类。下有子类:AddRequest,LoadRequest,DeleteRequest。

       

    MyRequest
    1 public class MyRequest
    2 {
    3 public string Action { get; private set; }
    4 //public GridPagerParams Pager { get; private set; }
    5  
    6 public MyRequest()
    7 {
    8
    9 }
    10 public virtual string Msg()
    11 {
    12 return Action.ToString();
    13 }
    14 }

    MyRequest定义了一个虚方法 Msg();

    各个子类由于算法不同,可重写该方法。

    下面是关键:MyRequestCreator

    MyRequestCreator 负责判断参数action,并返回相应的 request.

    MyRequestCreator
    public class MyRequestCreator
    {
    private static Dictionary<string, MyRequestCreator._newMyType> _CreatorDict = new Dictionary<string, MyRequestCreator._newMyType>();
    private delegate MyRequest _newMyType();
    static MyRequestCreator()//初始化
    {
    _CreatorDict.Add(
    "load", new MyRequestCreator._newMyType(delegate() { return new LoadRequest(); }));
    _CreatorDict.Add(
    "add", new MyRequestCreator._newMyType(delegate() { return new AddRequest(); }));//
    _CreatorDict.Add("delete", new MyRequestCreator._newMyType(delegate() { return new MyRequest(); }));
    }
    public static MyRequest CreateHandler(string action)
    {
    if (_CreatorDict.ContainsKey(action))
    {
    MyRequest retHandler
    = _CreatorDict[action].Invoke();
    try
    {
    return retHandler;
    }
    catch (Exception e)
    {
    throw new Exception("请求处理失败!", e);
    }
    }
    return null;
    }
    }

    客户端调用时:

    MyRequest request = MyRequestCreator.CreateHandler("load");

    这样就可以生成MyRequest的具体子类,并以MyRequest方式使用它的功能。

    整个过程完全没有if或者case,配合emit还可以实现动态增加MyRequest的子类并注册到MyRequestCreator中去。

    更重要的是,使用这种方式,比根据Activator.CreateInstance(typeof(MyRequest));产生的对象要快的多,接近于直接使用new object()的方式。

  • 相关阅读:
    Prometheus监控Mongodb副本集
    Mongodb的分片集群基本操作
    Prometheus修改数据保留时间
    Logstash修改UTC时间为东八区时间(北京时间)
    Prometheus 邮件告警自定义模板的触发时间为utc的解决方法
    MongoDB 分片片键如何选择
    MongoDB分片(Sharding)技术
    prometheus进程监控
    prometheus各种告警规则
    Alertmanager邮件告警
  • 原文地址:https://www.cnblogs.com/lsjwzh/p/1684967.html
Copyright © 2020-2023  润新知