C#通过工厂模式,我把一大堆if干掉了

概述

之前做微信项目的时候,会涉及到一个回调,大家都知道回调事件是很多类型的,一般是根据不同的类型在进行不同的逻辑处理。

这样就会延伸出一个问题,就是入口处会有一大堆if判断。这样本身是没什么问题的,只是看起来比较别扭,那么怎么把if干掉了 。这时候工厂模式派上用场了。下面我们来看下具体如何实现。

代码实现

1、定义虚方法Notify

  #region 定义虚方法public class Notify{public virtual Dingdong.Wallet.Common.Result NotifyHandle(NotifyResult Result, dynamic respData){Dingdong.Wallet.Common.Result r = new Result();return r;}}#endregion

2、定义Attribute属性,并且指定一个参数ServiceName

  [System.Serializable][System.AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = false)][System.Runtime.InteropServices.ComVisible(true)]public class InterfaceAttribute : Attribute{private string _ServiceName;        public InterfaceAttribute(){}public string ServiceName{get { return _ServiceName; }set { _ServiceName = value; }}}

3、实现一个工厂NotifyFactory,通过反射把包含Attribute的找出来

  #region Factorypublic class NotifyFactory{public Notify CreateNotify(string _name){Dictionary<string, string> dic = new Dictionary<string, string>();string strNamespace = Assembly.GetExecutingAssembly().GetName().Name;//    LogHelper.WriteInfo("命名空间:" + strNamespace);var classes = Assembly.Load(strNamespace).GetTypes();foreach (var item in classes){Object[] obs = item.GetCustomAttributes(typeof(InterfaceAttribute), false);foreach (InterfaceAttribute record in obs){dic.Add(record.ServiceName, item.Name);//     LogHelper.WriteInfo("接口名称:" + record.ServiceName + "-类名:" + item.Name);}}Assembly myAssembly = Assembly.GetExecutingAssembly();Notify Notify = (Notify)myAssembly.CreateInstance(strNamespace + "." + dic[_name]);return Notify;}}#endregion

4、前端通过传入ServiceName,实现不同的业务逻辑

      NotifyFactory Factory = new NotifyFactory();Notify Fa = Factory.CreateNotify(Notifyresult.ServiceName);//PERSONAL_REGISTER_EXPANDDingdong.Wallet.Common.Result r= Fa.NotifyHandle(Notifyresult, Result);//new  NotifyResult() ,"respData"LogHelper.WriteInfo("异步通知结束");LogHelper.WriteInfo("异步通知结束r:"+ r.Serialize());

5、其中一个具体的方法重载NotifyHandle,并且定义   [Interface(ServiceName = "DIRECT_RECHARGE")]

  [Export]/// <summary>/// 代扣交易   InterfaceAttribute 接口名称  类名自定义 确保命名空间在FuYin.Wallet.Notify 下/// </summary>[Interface(ServiceName = "DIRECT_RECHARGE")]public class DirectRecharge : Notify{public override Result NotifyHandle(NotifyResult r, dynamic respData){//  return base.NotifyHandle(Result, respData);//r.ServiceName 异步通知接口方法//  r.ResponseType  //回调类型LogHelper.WriteInfo("公共数据:" + r.Serialize());DirectRechargeNotifyResult model = JsonConvert.DeserializeObject<DirectRechargeNotifyResult>(respData);LogHelper.WriteInfo("业务处理数据:" + model.Serialize());using (var context = new MefContext()){var svc = context.GetService<IDeTransactionService>();return svc.DirectRechargeNotify(model);}}}

这样就可以把一大堆if去掉了,代码看起来也简洁多了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303680.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

再过四十年,你的女朋友可能是个美丽的机器人!不信你看

“美国西部、科幻、人工智能 、 机器人革命”&#xff0c;这 4 个看似不相关的元素却组成了一部新神剧《西部世界&#xff1a;Westworld》。《西部世界》可是聚粉丝千万&#xff0c;由1973年迈克尔克里奇顿执导的同名电影改编而成的电视剧。在剧中&#xff0c;整个“西部世界”…

mac下nvm_Mac OS 使用 nvm 管理 node 与 npm 版本

nvm 是 Mac 下的 node 管理工具&#xff0c;有点类似管理 Ruby 的 rvm&#xff0c;如果是需要管理 Windows 下的 node&#xff0c;官方推荐是使用 nvmw 或 nvm-windows 。以下具体说下 Mac 系统中的安装与使用细节(Windows 系统仅供类比参考)。1. 卸载已安装到全局的 node/npm如…

如何解决ORA-12638: 身份证明检索失败错误

今天连接一个以前正常连接的Oracle数据库&#xff0c;突然报错ORA-12638&#xff0c;说身份证明检索失败。感觉很奇怪&#xff0c;后来一查&#xff0c;发现是因为我电脑是出于Windows的Domain中的&#xff0c;而sqlnet文件中指定的认证方式是MTS&#xff0c;所以出错了。 解决…

模型存储在哪里_最强的模型工作收纳站「Artty Station」登场!

大部分做模型的人&#xff0c;都有同一个梦想——那就是「属于自己的模型空间」。但很少有人&#xff0c;有足够的空间去收纳自己的模型工具。而现在&#xff0c;一款号称史上最强的模型收纳站「Artty Station」横空出世了&#xff0c;现在正在日本网站Makuake上进行众筹&#…

.NET6 中的 PriorityQueue

.NET6 中的 PriorityQueueIntro.NET 6 中引入了一个新的集合类型 PriorityQueue&#xff0c;正如它的名字那样&#xff0c;在普通的 Queue 基础之上增加了优先级的支持&#xff0c;接下来就一起来看一下怎么使用&#xff0c;以及一些常用的使用场景介绍。Get Started来看一个简…

成渝地区微型计算机产业,2020届广州市高三年级调研测试文综地理试题(含答案).doc...

2020届广州市高三年级调研测试文综地理试题(含答案).doc2020届广州市高三年级调研测试文科综合(地理部分)一、选择题下表为我国四个省市2009年、2018年微型计算机产量对比表。据此完成1-3题。1与上海、江苏相比&#xff0c;2009年成渝地区微型计算机生产处于“空白”状态&#…

大数据教你实现预测未来,这不是梦

随着数据挖掘与人工智能技术的发展&#xff0c;越来越多的企业将大数据运用到生产实践与决策指导中。其中&#xff0c;构建合适的模型对未来的趋势进行预测&#xff0c;是数据挖掘中十分重要的一部分。本文将通过一个小案例教会你如何利用数据挖掘技术实现预测未来不是梦。【工…

简单而不简陋﹣wp7视觉点滴

一直就很期待&#xff0c;引入了Metro设计理念的wp7的真实操作体验&#xff0c;现在终于如愿了。拿到测试机&#xff0c;首先迅速的过了一遍&#xff0c;第一印象就是界面简单明了&#xff0c;没有华丽的高光、没有跌宕的质感&#xff0c;真的感觉就像在公共场所看到的信息指示…

ros发布节点信息python_vscode开发ROS1(13)-python实现话题通信(msg)

写在最前面1, ros也是可以使用python进行编程的, 而且相比c来说, ros更加简单.使用python创建第一个ROS程序1, 在ros_test目录下, 新建一个scripts文件夹.2, 修改CMakeLists.txt文件, 在find_package中添加rospyfind_package(catkin REQUIRED COMPONENTS roscpp ... #其他的包 …

BeetleX 之 WebApi网关1.5.8发布

这一版本的主要升级了BeetleX的基础网络库&#xff0c;主要解决在某些情况导致解释http协议cpu暴增长的问题&#xff0c;同时使用BeetleX新版本针对的IndexOf的优化&#xff0c;使http协议解释上有着一定程度的性能提升。新版本同样也是支持win64和linux64两个版本&#xff0c;…

html css 重复,CSS重复定义的问题请教_html/css_WEB-ITnose

&#xff0c;是不是就无效了&#xff1f;回复讨论(解决方案)外部css样式和内部css样式同时存在&#xff0c;以内部css样式为准。内部css样式与标签的style属性同时存在&#xff0c;以style属性的样式为准。你说的这种情况应该是两者都会有效&#xff0c;但CSS类的优先级更高&am…

入门 | 机器学习第一课:决策树学习概述与实现

基于树的学习算法在数据科学竞赛中相当常见。这些算法给预测模型赋予了准确性、稳定性以及易解释性。其中&#xff0c;决策树算法也是引人关注的「随机森林」算法的基础构造模块。本文介绍了决策树的概念和简单实现&#xff0c;使用生动的示例帮助理解&#xff0c;希望能够对你…

LoadPostData 的一些注意事项

LoadPostData是接口IPostBackDataHandler的方法 方法一般长这样 public bool LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection) { string strOldValue Text; string strNewValue postCol…

egg前面加什么_国威说阀:阀门前面为什么加国标美标日标之类的?

原标题&#xff1a;国威说阀&#xff1a;阀门前面为什么加国标美标日标之类的&#xff1f;美标阀门就是美国标准的意思&#xff0c;通常称呼的美标球阀&#xff0c;美标闸阀和其它什么阀门都是按照美国标准制造出来的阀门其中一类。标准的编制说明是一个非常重要的文件。它阐明…

读《有效需求分析》

最近在一个技术群里看到张逸大佬强力推荐一本关于需求分析的书《有效需求分析》&#xff0c;于是在 Kindle 上下单了&#xff0c;读完后有一种相见恨晚的感觉。本书特点从书中的一些案例可以看出&#xff0c;作者擅长 ToB 软件的需求分析&#xff0c;如果您是从事的 ToB 软件的…

超时锁定计算机,就会发现多了一个控制台锁定显示关闭超时选项

小技巧&#xff1a;锁定屏幕方法多在临时要离开电脑时&#xff0c;可用CtrlAltDel组合键、WinL组合键或在开始菜单中单击用户头像选择“锁定”手动锁屏;或借用“屏幕保护设置”设定自动定时锁屏。1. 探寻自动锁屏时间修改离开电脑一段时间后Windows 10会自动锁屏&#xff0c;但…

忽略NVRAM的config,修改cisco密码

修改configuration-egister&#xff08;配置寄存器&#xff09;的位值&#xff0c;忽略NVRAM里的start-running&#xff0c;修改enable密码 默认位置为0x2102,可以通过route#show version 最后行查看 Cisco2600 reload......CtrlBreak rommon> confreg 0x2142 remmon> re…

超好用的27个谷歌Chrome浏览器使用技巧

编者按&#xff1a;Chrome堪称浏览器的业界良心&#xff0c;但是你真的完全懂得它的正确打开方式吗&#xff1f;这27条tips能帮助你实现一些你从未想到的功能&#xff0c;提升工作效率、节省大量时间。赶紧get起来吧&#xff01;本文编译自 fastcompany 原题为 27 Incredibly U…

android数据存放map_ES6 的新鲜玩意儿——集合set、map、WeekSet、WeekMap

es6新增了Set、Map、WeekSet、WeekMap 四种数据结构。C#中有HashSet和Dictionary&#xff0c;HashSet和Dictionary都是范式集合&#xff0c;但是es6不支持接口开发&#xff0c;所以也就不存在范式。Set 是存唯一值的集合&#xff0c;Map是存键值对的集合。WeakSet、WeakMap分别…

大牛领导单独找我聊了两句:搞框架的同时别忘了算法

前言程序数据结构算法&#xff0c;好的算法能让程序更高效的运行&#xff1b;在当今数据信息时代&#xff0c;数据分析和数据处理肯定是避免不了&#xff0c;而算法便成为了很多公司门槛级的要求&#xff0c;特别是大厂&#xff1b;赶紧搞起来&#xff0c;说不定离进大厂就只差…