1 问题描述
在一个网站中,要对调用WCF服务返回的结果集数进行一次计算,但是原有的数据也要保存起来,老的数据和新的数据都要存库。对于这样的需求,其实最好的方法是就是直接修改服务端的Model,但是这个服务调用的地方太多了,如果这样修改的话,影响点会比较大,而且并不是所有的调用方都要这样处理,比如说接口用户,就没有这样的需求。因此这个需求只能客户端网站自己处理。
2 假设场景
需求是工作中遇到的,撇开原始场景,可以抽象成下面这样的情况:
说明:现在要根据用户的习惯,来决定显示在页面上的商品信息。网站用户查询商品信息,Web网站调用商品查询服务,返回商品订单列表给用户。没有加需求之前,可以理解为商品查询服务返回出来的商品信息是什么,就给用户显示什么,现在要预测用户的习惯,展示商品信息,并且要创单将新旧两种信息存库。
3 解决方法
我不知道其他人在面对这样的需求时,会怎么做,我的第一反应是,新建一个商品信息子类(ProductSub),继承商品查询服务的商品信息(Product)。然而这依然有一大堆麻烦。
商品查询服务的商品Model是比较复杂的,网站会把查询出来的商品信息都存入Session中,用户在页面上选中一条商品,创单的时候,再从Session中把这个商品信息取出来,封装订单服务创单的对象,创建订单。我的想法是,先把查询出来的每一个Product转换成ProductSub对象,再查询用户习惯,进行处理,把该填充的数据填充进去,再进行排序之类的页面展示顺序的调整。创单的时候,把ProductSub对象转换成Product对象,把要存储的信息放到一个Information对象中,创单
我遇到的一个麻烦就是,Product类不能直接转为ProductSub类的。C#基础知识,这个时候,我就想起了一个扩展类。具体怎么用,参见这篇博客:http://www.cnblogs.com/WindBlog/archive/2011/07/29/2120655.html,但其实放到Bussiness也是可以的。但是我觉得如果我用到product对象对象就能直接点出ParseProductSub类的方法应该是更好的。另一个问题是,在创单的时候,如果把ProductSub对象强制转换为Product对象的话,调服务的时候会报一个错误因为ProductSub,我想着肯定是订单服务并没有这个类,只有Product类。于是我在ProductSub类中写了一个方法ParseProduct,里面的方法,就是调用了一个return base.Copy(),就是调用返回父类的一个深复制类。
写这篇文章的目的,是想如果发现了更好的办法,我就明天来悄悄咪咪改得更加高级一点,但是现在想来,我可能根本没有把问题描述清楚。我看前一个人的处理方式是,直接新建一个类VMInfo
类似这样,我就纠结了很久在这两种方式上,最后我还是选择上面一种。
public class VMInfo { public Product product { get; set; } // 这是新的类 public OtherInfo otherInfo { get; set; } }