扩展DLL中的Model

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;
  }
}
复制代码
4 后记

结果是我想多了,这篇文章很快被博客园移除掉了,而且需求也变得没有那么复杂,怎么做都可以了。但是我的代码还是保留在,因为如果不存储字段信息的话,就至少需要算两次。这个是因为计算简化了,算两次我也不复杂。我觉得蛮奇怪的是,我以前写的博客,什么排版布局都没有还没有被移除首页,这次是我花了一个小时多写的,结果被移除了,大概是内容不好,原来排版也不是那么重要。

posted on   BestNow  阅读(443)  评论(0编辑  收藏  举报

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示