zoukankan      html  css  js  c++  java
  • 强弱之争

    在编程过程中常常会遇到这样一些困扰:

    场景:domain实体A具有属性(B,C,D,E),那么我们建实体A的Class具有属性B,C,D,E.但是对于不同角色A的表现形式可能不一样,在财务看来可能需要B,C,D,E,F属性(F为计算属性),在生产需要B,C,D,E,G属性(G为XX属性),在销售看来需要B,C,D,E,H属性(H为XX属性).

    我们经常需要创建类A1(B,C,D,E,F),A2(B,C,D,E,G),A3(B,C,D,E,H),A1,A2,A3均继承自A类.

    还有一类需求,有时候我们只需要A的属性B,C或者B,D等,相当于A的属性的一个投影.

    解决方案有:

            1.建视图,建实体与之对应.

            2.A实体转化为A1,A2,A3,类对于投影实体A转化为AT1(B,C),AT2(B,D).

            3.A实体用Linq转化为匿名实体类

    不管如何处理,必须有实体转化的麻烦(循环赋值,A1,A2,A3可以as为A,但是A无法直接转化为A1,A2,A3,投影实体两者之间就更加无法转化了),而且实体类型的增加.

    在数据库访问层面要转化为实体类型,要么自己写转化方法,要么利用反射动态转.

    为什么我要推荐http:smartobject.codeplex.com呢?优势显而易见!

    1.SmartObject的属性非常易于扩展,直接dynamic d=new SmartObject();d.属性=value或d["属性"]=value就增加了一个属性

    2.对json序列化(d.ToJson(),对于List<SmartObject>使用SmartJosnSerializer.Serialize(list))和反序列化(SmartObject.Parse("JSON字符串")单个类型或SmartJosnSerializer.Deserialize("JSON字符串")反序列化列表类型)支持良好

    3.提供了属性和索引访问方式(json.net反序列化为JObject只能是obj[prop].ToObject<T>(),这一步显然需要额外的开销运算,这样访问方式很不优雅)

    4.反序列化之后的类型准确(你会发现json.net反序列化后类型不精确)

    5.DataTable,IDataReader转化为List对象具有通用快速转化方法可以简单实现:

    public static IList<dynamic> ToList(this DataTable datatable)
            {
                List<dynamic> list = new List<dynamic>();
                if ((datatable.Rows != null) && (datatable.Rows.Count > 0))
                {
                    DataColumnCollection columns = datatable.Columns;
                    for (int i = 0; i < datatable.Rows.Count; i++)
                    {
                        dynamic obj2 = new SmartObject();
                        DataRow row = datatable.Rows[i];
                        for (int j = 0; j < columns.Count; j++)
                        {
                            string columnName = columns[j].ColumnName;
                            object obj3 = row[j];
                            obj2[columnName] = (obj3 == DBNull.Value) ? null : obj3;
                        }
                        list.Add(obj2);
                    }
                }
                return list;
            }
    
            public static IList<dynamic> ToList(this IDataReader reader)
            {
                List<dynamic> list = new List<dynamic>();
                if (!reader.IsClosed)
                {
                    using (reader)
                    {
                        while (reader.Read())
                        {
                            dynamic obj2 = new SmartObject();
                            for (int i = 0; i < reader.FieldCount; i++)
                            {
                                string name = reader.GetName(i);
                                object obj3 = reader.GetValue(i);
                                obj2[name] = (obj3 == DBNull.Value) ? null : obj3;
                            }
                            list.Add(obj2);
                        }
                    }
                }
                return list;
            }
    
            public static IList<dynamic> ToList(this DataTable datatable, Func<DataRow, dynamic> parser)
            {
                List<object> list = new List<object>();
                if (((datatable.Rows != null) && (datatable.Rows.Count > 0)) && (parser != null))
                {
                    DataColumnCollection columns = datatable.Columns;
                    for (int i = 0; i < datatable.Rows.Count; i++)
                    {
                        list.Add(parser(datatable.Rows[i]));
                    }
                }
                return list;
            }
    
            public static IList<dynamic> ToList(this IDataReader reader, Func<IDataReader, dynamic> parser)
            {
                List<dynamic> list = new List<dynamic>();
                if (!reader.IsClosed && (parser != null))
                {
                    using (reader)
                    {
                        while (reader.Read())
                        {
                            list.Add(parser(reader));
                        }
                    }
                }
                return list;
            }
        }

     SmartObject不适合用在性能要求高的场景,另外动态类型无法享受智能提示.

  • 相关阅读:
    msp430项目编程
    msp430入门编程50
    msp430入门编程47
    msp430入门编程46
    msp430入门编程45
    msp430入门编程43
    iOS7上leftBarButtonItem无法实现滑动返回的完美解决方案
    Linux下MySQL 5.5的修改字符集编码为UTF8(彻底解决中文乱码问题)
    Android keystore 密码找回
    Android应用程序签名详解
  • 原文地址:https://www.cnblogs.com/kingge/p/4510867.html
Copyright © 2011-2022 走看看