OO Mapper 实践(下篇)

  上篇介绍了OO Mapper 最核心的映射,简单类型映射,这篇将介绍的复合类型的映射。

      1. Dictionary - > Dictionary 字典类型分为:IDictionary,IDictioanry<TKey,TValue>

        public class SourceValue
        {
            public int Value { get; set; }
        }

        public class DestValue
        {
            public int Value { get; set; }
        }

        

        [Test]
        public void Example()
        {
            var sourceDict = new Dictionary<string, SourceValue>
				{
					{"First", new SourceValue {Value = 5}},
					{"Second", new SourceValue {Value = 10}},
					{"Third", new SourceValue {Value = 15}}
				};

            var destDict = Mapper.Map<Dictionary<string, SourceValue>, IDictionary<string, DestValue>>(sourceDict);
            Assert.AreEqual(3, destDict.Count);
            Assert.AreEqual(destDict["First"].Value, 5);
            Assert.AreEqual(destDict["Second"].Value, 10);
            Assert.AreEqual(destDict["Third"].Value, 15);
            
        }

        [Test]
        public void Example2()
        {
            var sourceDict = new Dictionary<int, SourceValue>
				{
					{1, new SourceValue {Value = 5}},
					{2, new SourceValue {Value = 10}},
					{3, new SourceValue {Value = 15}}
				};

            var destDict = Mapper.Map<Dictionary<int, SourceValue>, IDictionary<string, DestValue>>(sourceDict);
            Assert.AreEqual(3, destDict.Count);
            Assert.AreEqual(destDict["1"].Value, 5);
            Assert.AreEqual(destDict["2"].Value, 10);
            Assert.AreEqual(destDict["3"].Value, 15);

        }

        enum sourceKey
        {
            First,
            Second,
            Third,
        }

        enum destKey
        {
            First,
            Second,
            Third,
        }

        public void Example3()
        {
            var sourceDict = new Dictionary<sourceKey, SourceValue>
				{
					{sourceKey.First, new SourceValue {Value = 5}},
					{sourceKey.Second, new SourceValue {Value = 10}},
					{sourceKey.Third, new SourceValue {Value = 15}}
				};

            var destDict = Mapper.Map<Dictionary<sourceKey, SourceValue>, IDictionary<destKey, DestValue>>(sourceDict);
            Assert.AreEqual(3, destDict.Count);
            Assert.AreEqual(destDict[destKey.First].Value, 5);
            Assert.AreEqual(destDict[destKey.Second].Value, 10);
            Assert.AreEqual(destDict[destKey.Third].Value, 15);

        }

        public void Example4()
        {
            var sourceDict = new Hashtable()
				{
					{1, new SourceValue {Value = 5}},
					{2, new SourceValue {Value = 10}},
					{3, new SourceValue {Value = 15}}
				};

            var destDict = Mapper.Map<Hashtable, IDictionary<string, DestValue>>(sourceDict);
            Assert.AreEqual(3, destDict.Count);
            Assert.AreEqual(destDict["1"].Value, 5);
            Assert.AreEqual(destDict["2"].Value, 10);
            Assert.AreEqual(destDict["3"].Value, 15);

        }

        public void Example5()
        {
            var sourceDict = new Dictionary<int, SourceValue>()
				{
					{1, new SourceValue {Value = 5}},
					{2, new SourceValue {Value = 10}},
					{3, new SourceValue {Value = 15}}
				};

            var destDict = Mapper.Map<Dictionary<int, SourceValue>, Hashtable>(sourceDict);
            Assert.AreEqual(3, destDict.Count);
            Assert.AreEqual((destDict[1] as SourceValue).Value, 5);
            Assert.AreEqual((destDict[2] as SourceValue).Value, 10);
            Assert.AreEqual((destDict[3] as SourceValue).Value, 15);

        }

  2. Class -> Dictionary

       public class Person1
        {
            public string Name { get; set; }
            public int Age { get; set; }
            public bool Sex { get; set; }
        }

        [Test]
        public void SimpleTest()
        {
            var source = new Person1 { Name = "Kevin", Age = 30, Sex = true };
            var dst = Mapper.Map<Person1, IDictionary<string, object>>(source);

            Assert.AreEqual(dst["Name"], source.Name);
            Assert.AreEqual(dst["Age"], source.Age);
            Assert.AreEqual(dst["Sex"], source.Sex);
        }

        [Test]
        public void IgnoreMemberTest()
        {
            var source = new Person1 { Name = "Kevin", Age = 30, Sex = true };
            var dst = Mapper
                .CreateMapper<Person1, IDictionary<string, object>>()
                .IgnoreSourceMember(x => x.Sex)
                .Map(source);

            Assert.AreEqual(dst["Name"], source.Name);
            Assert.AreEqual(dst["Age"], source.Age);
            Assert.IsFalse(dst.ContainsKey("Sex"));
        }

  3.  Dictionary -> Class 简单转换

public class TeamSearchCondition
        {
            public string BusinessCategory;
            public string NIROI;
            public string Lob;
            [Splite(',')]
            public int[] Product;
            public string FormName;
        }

        [Test]
        public void Test()
        {
            var source = new Dictionary<string, string>();
            source["BusinessCategory"] = "kevin";
            source["NIROI"] = "30";
            source["Lob"] = "true";
            source["Product"] = "1,2";
            source["FormName"] = "true";

            var dst = Mapper.Map<IDictionary<string, string>, TeamSearchCondition>(source);

            Assert.IsNotNull(dst);

            Assert.IsNotNull(dst.Product != null);
            Assert.AreEqual(2, dst.Product.Length);
            Assert.AreEqual(1, dst.Product[0]);
            Assert.AreEqual(2, dst.Product[1]);
        }

    4. Dictioanry -> Class 复杂一点的转换

 public class Book
        {
            public int BookId { get; set; }
            public string BookName { get; set; }
            public Author Author { get; set; }
            public DateTime PublishedDate { get; set; }
        }

        public class Author
        {
            public int AuthorId { get; set; }
            public string AuthorName { get; set; }
            public string Nation { get; set; }
        }

        [Test]
        public void TestSubProperty()
        {
            var sourceDict = new Dictionary<string, string>
				{
					{"BookName", "设计模式"},
					{"Author.AuthorName", "四人帮"},
					{"Author.AuthorId", "3"}
				};

            var destDict = Mapper.Map<Dictionary<string, string>, Book>(sourceDict);

            Assert.NotNull(destDict);
            Assert.AreEqual("设计模式", destDict.BookName);
            Assert.AreEqual("四人帮", destDict.Author.AuthorName);
            Assert.AreEqual(3, destDict.Author.AuthorId);
        }

  5. DataReader -> List

       public enum TestClassStatus
        {
            First = 0,
            Second = 1
        }

        class TestClass
        {
            public int Id { get; set; }
            public string Name;

            public TestClassStatus? Status;
            public Guid Guid;
        }

       

        [Test]
        public void Test()
        {
            var dt = new DataTable();
            dt.Columns.Add(new DataColumn("Id", typeof(long)));
            dt.Columns.Add(new DataColumn("Name", typeof(string)));
            dt.Columns[1].AllowDBNull = true;
            dt.Columns.Add(new DataColumn("Status", typeof(long)));
            dt.Columns.Add(new DataColumn("Guid", typeof(Guid)));

            int count = 5;
            for (int i = 0; i < count; ++i)
            {
                if(i%2 == 0)
                    dt.Rows.Add(i, Guid.NewGuid().ToString(), DBNull.Value, Guid.NewGuid());
                else
                    dt.Rows.Add(i, DBNull.Value, 1, Guid.NewGuid());
            }

            var reader = dt.CreateDataReader();

            var items = Mapper.Map<IDataReader, IEnumerable<TestClass>>(reader);

            Assert.AreEqual(count, items.Count());
            
            foreach(DataRow row in dt.Rows)
            {
	            	var o1 = row[0];
	            	var o2 = row[1];
	            	var o3 = row[2];
	            	var o4 = row[3];
            	  
	            	var i1 = Mapper.Map<object,int>(o1);
	            	var i2 = Mapper.Map<object,string>(o2);
	            	var i3 = Mapper.Map<object,int>(o3);
	            	var i4 = Mapper.Map<object,Guid>(o4);
            }
        }

  6. DataTable -> List  (原理是先把DataTable->DataReader->List)

      7. List -> DataTable (略)

      8. ListSource -> List , List -> ListSource (略)

      9. List -> List

       enum MappingFromStatus
        {
            Value1 = 0,
            Value2 = 1
        }

        class MappingFrom
        {
            public int FromID { get; set; }
            public string Name;

            public int Other;

            public MappingFromStatus Status;

            public Guid Guid;
        }

        struct MappingTo
        {
            public int From_id;
            public string Name { get; set; }

            public string Other2;

            public int Status;
            public Guid Guid;
        }

        [Test]
        public void Test()
        {
            var actual = Mapper.Map<string, int>("12");
            Assert.AreEqual(12, actual);


            Assert.AreEqual(1, Mapper.Map<int, decimal?>(1));

            var actualArray = Mapper.Map<IList<int>, decimal?[]>(new List<int> { 1, 2, 3 });
            Assert.AreEqual(2, actualArray[1]);


            var longColl = Mapper.Map<int[], List<long>>(new int[] { 1, 2, 3 });
            Assert.AreEqual(2, longColl[1]);

            var doubleArray = Mapper.Map<List<string>, double[]>(new List<string> { "1.1", "2.2", "3.3" });
            Assert.AreEqual(2.2, doubleArray[1]);


            Mapper
                .CreateMapper<MappingFrom, MappingTo>()
                .IgnoreCase(true)
                .IgnoreUnderscore(true)
               .IgnoreSourceMember(x => x.Guid);

            var guid = Guid.NewGuid();
            var customFrom = new MappingFrom { FromID = 1, Name = "name", Status = MappingFromStatus.Value2, Guid = guid };
            var customTo = Mapper.Map<MappingFrom, MappingTo>(customFrom);
            Assert.AreEqual(1, customTo.From_id);
            Assert.AreEqual("name", customTo.Name);
            Assert.IsNullOrEmpty(customTo.Other2);
            Assert.AreEqual(1, customTo.Status);
            Assert.AreNotEqual(guid, customTo.Guid);

  10. Class -> Class

        public class ModelObject
        {
            public DateTime BaseDate { get; set; }
            public ModelSubObject Sub { get; set; }
            public ModelSubObject Sub2 { get; set; }
            public ModelSubObject SubWithExtraName { get; set; }
        }

        public class ModelSubObject
        {
            public string ProperName { get; set; }
            public ModelSubSubObject SubSub { get; set; }
        }

        public class ModelSubSubObject
        {
            public string IAmACoolProperty { get; set; }
        }

        public class ModelDto
        {
            public DateTime BaseDate { get; set; }
            public string SubProperName { get; set; }
            public string Sub2ProperName { get; set; }
            public string SubWithExtraNameProperName { get; set; }
            public string SubSubSubIAmACoolProperty { get; set; }
        }

        [Test]
        public void TestFlattering()
        {
            var source = new ModelObject
            {
                BaseDate = DateTime.Now,
                Sub = new ModelSubObject
                {
                    ProperName = "Some name",
                    SubSub = new ModelSubSubObject
                    {
                        IAmACoolProperty = "Cool daddy-o"
                    }
                },
                Sub2 = new ModelSubObject
                {
                    ProperName = "Sub 2 name"
                },
                SubWithExtraName = new ModelSubObject
                {
                    ProperName = "Some other name"
                },
            };

            var b =Mapper.Map<ModelObject, ModelDto>(source);

            Assert.AreEqual(source.BaseDate, b.BaseDate);
            Assert.AreEqual(source.Sub.ProperName, b.SubProperName);
            Assert.AreEqual(source.Sub2.ProperName, b.Sub2ProperName);
            Assert.AreEqual(source.SubWithExtraName.ProperName, b.SubWithExtraNameProperName);
            Assert.AreEqual(source.Sub.SubSub.IAmACoolProperty, b.SubSubSubIAmACoolProperty);
        }

完。

posted @ 2011-04-08 15:53 风云 阅读(...) 评论(...) 编辑 收藏