反射动态创建不同的Processor
1. 定义抽象方法
public abstract class BaseProcesser
{
public abstract void GetCustomerReportCardDetailInfo(CustomerReportCardRequest request, ReportCardResult response);
}
2. 所有Processor都继承自BaseProcessor
public class GiftProcesser : BaseProcesser
{
public override void GetCustomerReportCardDetailInfo(CustomerReportCardRequest request, ReportCardResult response)
{
response.GiftInfo = GiftAccessor.GetGiftInfo(request);
}
}
3.将Processor的名称配置起来,通过反射动态加载去执行
4.具体示例如下:
public static CustomerReportCardResponse GetCustomerReportCardInfo(CustomerReportCardRequest request, string view, string[] expand)
{
ReportCardResult result = new ReportCardResult();
List<string> currencyCodes = new List<string>();
if (view == "DETAIL")
{
if (!CheckCurrencyCode(request, ref currencyCodes))
{
return null;
} IEnumerable<string> processKeys = AllProcessers.Where(n => expand.Contains(n.Key)).Select(n => n.Key);
foreach (var key in processKeys)
{
var processer = AllProcessers[key];
processer.GetCustomerReportCardDetailInfo(request, result);
}
}
return SetCustomerReportCardResponse(result, request, currencyCodes);
} private static Dictionary<string, BaseProcesser> allProcessers = null;
private static Dictionary<string, BaseProcesser> AllProcessers
{
get
{
if (allProcessers == null)
{
allProcessers = new Dictionary<string, BaseProcesser>();
Dictionary<string, string> classNames = GetResource(); foreach (var key in classNames.Keys)
{
BaseProcesser detail = typeof(BaseProcesser).Assembly.CreateInstance(classNames[key]) as BaseProcesser;
if (detail == null) continue; if (!allProcessers.ContainsKey(key))
{
allProcessers.Add(key, detail);
}
}
}
return allProcessers;
}
} private static Dictionary<string, string> GetResource()
{
Dictionary<string, string> result = new Dictionary<string, string>();
PerKeyValue keyValue = ConfigContainer.KeyValuesConfig["CustomerReportCardExpand"];
if (keyValue == null) return null; PerKeyValueCollection keyValues = keyValue.KeyValues;
string assemblyBase = keyValue.Attributes["Class"].Value; foreach (PerKeyValue resource in keyValues)
{
if (resource == null) continue; result.Add(resource.Name, assemblyBase + "." + resource.Value);
}
return result;
}
反射动态创建不同的Processor的更多相关文章
- StructureMap.dll 中的 GetInstance 重载 + 如何利用 反射动态创建泛型类
public static T GetInstance<T>(ExplicitArguments args); // // Summary: // Creates a new instan ...
- C#反射动态创建实例并调用方法
在.Net 中,程序集(Assembly)中保存了元数据(MetaData)信息,因此就可以通过分析元数据来获取程序集中的内容,比如类,方法,属性等,这大大方便了在运行时去动态创建实例. MSDN解释 ...
- .Net 中的反射(动态创建类型实例) - Part.4
动态创建对象 在前面节中,我们先了解了反射,然后利用反射查看了类型信息,并学习了如何创建自定义特性,并利用反射来遍历它.可以说,前面三节,我们学习的都是反射是什么,在接下来的章节中,我们将学习反射可以 ...
- .Net 中的反射(动态创建类型实例)
动态创建对象 在前面节中,我们先了解了反射,然后利用反射查看了类型信息,并学习了如何创建自定义特性,并利用反射来遍历它.可以说,前面三节,我们学习的都是反射是什么,在接下来的章节中,我们将学习反射可以 ...
- OC 反射-->动态创建类
系统方法 NSLog(@"%s", __func__); //打印出类的方法名称,如: //打印结果:2018-02-22 10:52:15.394575+0800 DemoRun ...
- C# 学习笔记(一) Winform利用Assembly反射动态创建窗体
1. 添加Reflection //添加对Reflection程序集引用 using System.Reflection; // 引用窗体创建方法CreateForm,传入参数 private voi ...
- c#反射动态创建窗体
根据窗体的名称动态创建窗体 Assembly assembly = Assembly.GetExecutingAssembly(); // 实例化窗体 try { Form f ...
- C#根据反射动态创建ShowDoc接口文本信息
我目前每天主要工作以开发api为主,这都离不开接口文档.如果远程对接的话前端总说Swagger不清晰,只能重新找一下新的接口文档.ShowDoc就是一个不错的选择,简洁.大方.灵活部署. 但是话说回来 ...
- C#——反射动态创建类的实例
“反射”其实就是利用程序集的元数据信息. 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间. 若要反射当前项目中的类(即当前项目已经引用它了),可以使用下面的写法. ...
随机推荐
- StarUml:Exception EOleSysError in module StarUML.ex
http://sourceforge.net/p/staruml/discussion/510442/thread/9fe12cac/ run as administrator.Works fine.
- ios取证
摘录自:<IOS取证实战> Andrew Hoog著 viaForensics公司,今年已经募集到1600万创业基金 2007-2011年初,AT&T是在美国唯一为iphone提供 ...
- Zone.js 简介 & 抛砖引玉
Zone.js是angular团队参照NodeJS的Domain,Dart的Zone,为angular 2开发的核心组件. 一开始,我对Zone.js是拒绝的.我们知道类似的 Domain 模块,主要 ...
- Oracle 11g RAC环境下Private IP修改方法及异常处理
Oracle 11g RAC环境下Private IP修改方法及异常处理 Oracle 11g RAC环境下Private IP修改方法及异常处理 一. 修改方法 1. 确认所有节点CRS服务以启动 ...
- Linux 求文件交集 差集等
使用comm命令 假设两个文件FILE1和FILE2用集合A和B表示,FILE1内容如下: a b c e d a FILE2内容如下: c d a c 基本上有两个方法,一个是comm命令,一个是g ...
- ECShop商品详细页 实现尺码颜色关联显示库存数量
效果如下: 要开模板文件 goods.dwt 把选择尺码跟颜色的代码替换成如下,(不同模板代码可能不一样,对照去替换) <!-- {foreach from=$spec.values item ...
- 【html】button按钮的一些问题
问题: button 按钮在不设置 type 属性时,在不同的浏览器作用不一样.举个例子: html: <!doctype html> <html lang="en&quo ...
- 安装与配置 Elasticsearch
环境:centos6.7 #查询已经安装的JDK rpm -qa | grep jdk #卸载 yum -y remove java-1.8.0-openjdk-headless-1.8.0.91- ...
- 移动5年 Android生态系统的演进
由Google.HTC.Qualcomm联手打造的第一部Android手机G1,开启了移动时代的Android纪元(如图1所示),直到现在Android也是唯一能在移动市场上与iOS相抗衡的平台. ...
- apache工作模式:prefork和worker
apache作为现今web服务器用的最广泛也是最稳定的开源服务器软件,其工作模式有许多中,目前主要有两种模式:prefork模式和worker模式 一.两种模式 prefork模式: prefork是 ...