天天看點

Green.AgileMapper項目(2)-新增DO和DTO代碼生成

    代碼生成我本想利用t4模闆,但是由于我們的項目ide版本是vs2008,對于t4的參數傳遞支援還不是很友好,你可能說用appdomain.setdata,或者callcontext.logicalsetdata,但是可惜我們的餓mappingrule是不可序列化的,是以最後我隻得采用了字元串拼接最笨的辦法,為了應對生成政策不同,在這裡我們加入了政策模式來應付,來看看代碼結構吧:

Green.AgileMapper項目(2)-新增DO和DTO代碼生成

   在這裡隻支援對do的二級屬性映射為dto的平面屬性,全部針對imappingrule生成代碼,在這裡為了生成合法的代碼而非表達式,對以前的表達式進行了重新的标準約定,在代碼注釋。以及對上個版本的list轉換進行了多次重載,主要為了滿足dto到do對象的特殊要求,因為我們在領域開發存儲dto的時候都是需要先取出do對象在根據dto在do對象的基礎上進行修改,以便orm領域架構或者uow的跟蹤記錄。

Green.AgileMapper項目(2)-新增DO和DTO代碼生成
Green.AgileMapper項目(2)-新增DO和DTO代碼生成

studendo stu = new studendo() 

          { 

              id = 1, 

              name = "test1", 

              sex = sex.女, 

              address = new address() 

              { 

                  country = "中國", 

                  province = "四川", 

                  street = "高新區" 

              }, 

              courseids = new list<string>() { "1", "2", "3" }, 

              propertys = new list<keyvaluepair>() { new keyvaluepair() { key = "1", value = "1" } }, 

              contactway = new contactway() 

                  phone = "1111111111111111", 

                  email = "xxxx@12f", 

                  qq = "7889789999889" 

              } 

          }; 

          func<studendo, studendo, bool> fun = (f, j) => f.id == j.id; 

          var s = fun.tostring(); 

          var mapper = objectmappermanager.default.getmapper<studendto, studendo>(); 

          mapper.agilemappertemplatestrategy.defaultequalexpression = "{0}.id == {1}.id && {1}.id != 0";                  

          var str1 = mapper.codegenerator(); 

          system.io.file.delete(@"e:\project\opensource\agilemapper\agilemappper.test\codetemplate.test\1.cs"); 

          system.io.file.appendalltext(@"e:\project\opensource\agilemapper\agilemappper.test\codetemplate.test\1.cs", str1); 

          var mapper1 = objectmappermanager.default.getmapper<contactwaydto, contactway>();                    

          str1 = mapper1.codegenerator(); 

          system.io.file.delete(@"e:\project\opensource\agilemapper\agilemappper.test\codetemplate.test\2.cs"); 

          system.io.file.appendalltext(@"e:\project\opensource\agilemapper\agilemappper.test\codetemplate.test\2.cs", str1); 

          var mapper2 = objectmappermanager.default.getmapper<keyvaluepairdto, keyvaluepair>();            

          str1 = mapper2.codegenerator(); 

          system.io.file.delete(@"e:\project\opensource\agilemapper\agilemappper.test\codetemplate.test\3.cs"); 

          system.io.file.appendalltext(@"e:\project\opensource\agilemapper\agilemappper.test\codetemplate.test\3.cs", str1);

Green.AgileMapper項目(2)-新增DO和DTO代碼生成

最後的生成檔案: 

1.cs:

Green.AgileMapper項目(2)-新增DO和DTO代碼生成
Green.AgileMapper項目(2)-新增DO和DTO代碼生成

using system;

using system.linq;

using system.data;

using system.collections.generic;

namespace green.agilemapper

{

    public static partial class agilemappermapping

    {

        /// <summary>

        /// green.agilemapper.test.studendto  warp fromobj green.agilemapper.test.studendo;

        /// </summary>

        /// <param name="domainobj">green.agilemapper.test.studendo</param>

        /// <returns>green.agilemapper.test.studendto</returns>

        public static green.agilemapper.test.studendto warp(this green.agilemapper.test.studendo domainobj)

        {

            var fromobj = new green.agilemapper.test.studendto();

            fromobj.id = domainobj.id;

            fromobj.name = domainobj.name;

            fromobj.sex = domainobj.sex;

            if (domainobj.address != null)

            {

                fromobj.country = domainobj.address.country;

                fromobj.province = domainobj.address.province;

            }

            fromobj.particular = domainobj.address.country + " 國籍 " + domainobj.address.province + " 省 ";

            fromobj.firstpropertykey = domainobj.propertys[0].key;

            if (domainobj.contactway != null)

                fromobj.contactway = domainobj.contactway.warp();

            if (domainobj.courseids != null)

                fromobj.courseids = new list<system.string>();

                foreach (var item_courseids in domainobj.courseids)

                {

                    fromobj.courseids.add(item_courseids);

                }

            if (domainobj.propertys != null)

                fromobj.propertys = domainobj.propertys.warp();

            return fromobj;

        }

        /// green.agilemapper.test.studendto  warp domainobj green.agilemapper.test.studendo;

        /// <returns>fromobj</returns>

        public static void warp(this green.agilemapper.test.studendto fromobj, green.agilemapper.test.studendo domainobj)

            if (fromobj == null)

                return;

            if (domainobj == null)

                domainobj = new green.agilemapper.test.studendo();

            domainobj.id = fromobj.id;

            domainobj.name = fromobj.name;

            domainobj.sex = fromobj.sex;

            if (domainobj.address == null)

                domainobj.address = new green.agilemapper.test.address();

            domainobj.address.country = fromobj.country;

            domainobj.address.province = fromobj.province;

            if (domainobj.contactway == null)

                domainobj.contactway = new green.agilemapper.test.contactway();

            fromobj.contactway.warp(domainobj.contactway);

            if (fromobj.courseids != null)

                if (domainobj.courseids == null)

                    domainobj.courseids = new list<system.string>();

                domainobj.courseids.clear();

                foreach (var item_courseids in fromobj.courseids)

                    domainobj.courseids.add(item_courseids);

            if (fromobj.propertys != null)

                if (domainobj.propertys == null)

                    domainobj.propertys = new list<green.agilemapper.test.keyvaluepair>();

                fromobj.propertys.warp(domainobj.propertys, (fromobjitem, domainobjitem) => fromobjitem.key == domainobjitem.key, true);

        /// green.agilemapper.test.studendto collection warp fromobj green.agilemapper.test.studendo collection;

        /// <param name="form">green.agilemapper.test.studendto collection</param>

        /// <param name="domainobj">green.agilemapper.test.studendo collection</param>        

        public static list<green.agilemapper.test.studendto> warp(this ilist<green.agilemapper.test.studendo> domainobj)

            list<green.agilemapper.test.studendto> froms = new list<green.agilemapper.test.studendto>();

            domainobj.tolist().foreach(t =>

                froms.add(warp(t));

            });

            return froms;

        /// green.agilemapper.test.studendto collection warp domainobj green.agilemapper.test.studendo collection;

        /// <param name="fromobj">green.agilemapper.test.studendto collection</param>

        /// <param name="domainobj">green.agilemapper.test.studendo collection</param>      

        public static void warp(this ilist<green.agilemapper.test.studendto> fromobj, ilist<green.agilemapper.test.studendo> domainobj)

            fromobj.warp(domainobj, (fromobjitem, domainobjitem) => fromobjitem.id == domainobjitem.id && domainobjitem.id != 0, false);

        /// <param name="domainobj">green.agilemapper.test.studendo collection</param>

        /// <param name="isdeletenotinfromitem">delete the item that not in from collection</param>           

        public static void warp(this ilist<green.agilemapper.test.studendto> fromobj, ilist<green.agilemapper.test.studendo> domainobj, bool isdeletenotinfromitem)

            fromobj.warp(domainobj, (fromobjitem, domainobjitem) => fromobjitem.id == domainobjitem.id && domainobjitem.id != 0, isdeletenotinfromitem);

        /// <param name="equalpredicate">the from item equal to item expression</param>           

        public static void warp(this ilist<green.agilemapper.test.studendto> fromobj, ilist<green.agilemapper.test.studendo> domainobj, func<green.agilemapper.test.studendto, green.agilemapper.test.studendo, bool> equalpredicate)

            fromobj.warp(domainobj, equalpredicate, false);

        /// <param name="domainobj">green.agilemapper.test.studendo collection</param> 

        /// <param name="equalpredicate">the from item equal to item expression</param>      

        /// <param name="isdeletenotinfromitem">delete the item that not in from collection</param>     

        public static void warp(this ilist<green.agilemapper.test.studendto> fromobj, ilist<green.agilemapper.test.studendo> domainobj, func<green.agilemapper.test.studendto, green.agilemapper.test.studendo, bool> equalpredicate, bool isdeletenotinfromitem)

                domainobj = new list<green.agilemapper.test.studendo>();

            //如果需要删除不存在于 from的list集合,先删除後修改

            if (isdeletenotinfromitem)

                domainobj.where(domainobjitem => fromobj.firstordefault(fromobjitem => equalpredicate(fromobjitem, domainobjitem)) == null)

                    .tolist().foreach(t =>

                    {

                        domainobj.remove(t);

                    });

            fromobj.tolist().foreach(fromobjitem =>

                green.agilemapper.test.studendo toitem = default(green.agilemapper.test.studendo);

                if (equalpredicate != null)

                    toitem = domainobj.singleordefault(domainobjitem => equalpredicate(fromobjitem, domainobjitem));

                if (toitem == null)

                    toitem = new green.agilemapper.test.studendo();

                    domainobj.add(toitem);

                warp(fromobjitem, toitem);

    }

}

Green.AgileMapper項目(2)-新增DO和DTO代碼生成

2.cs 

Green.AgileMapper項目(2)-新增DO和DTO代碼生成
Green.AgileMapper項目(2)-新增DO和DTO代碼生成

using system;

        /// green.agilemapper.test.contactwaydto  warp fromobj green.agilemapper.test.contactway;

        /// <param name="domainobj">green.agilemapper.test.contactway</param>

        /// <returns>green.agilemapper.test.contactwaydto</returns>

        public static green.agilemapper.test.contactwaydto warp(this green.agilemapper.test.contactway domainobj)

            var fromobj = new green.agilemapper.test.contactwaydto();

            fromobj.phone = domainobj.phone;

            fromobj.email = domainobj.email;

            fromobj.qq = domainobj.qq;

        /// green.agilemapper.test.contactwaydto  warp domainobj green.agilemapper.test.contactway;

        public static void warp(this green.agilemapper.test.contactwaydto fromobj, green.agilemapper.test.contactway domainobj)

                domainobj = new green.agilemapper.test.contactway();

            domainobj.phone = fromobj.phone;

            domainobj.email = fromobj.email;

            domainobj.qq = fromobj.qq;

        /// green.agilemapper.test.contactwaydto collection warp fromobj green.agilemapper.test.contactway collection;

        /// <param name="form">green.agilemapper.test.contactwaydto collection</param>

        /// <param name="domainobj">green.agilemapper.test.contactway collection</param>        

        public static list<green.agilemapper.test.contactwaydto> warp(this ilist<green.agilemapper.test.contactway> domainobj)

            list<green.agilemapper.test.contactwaydto> froms = new list<green.agilemapper.test.contactwaydto>();

        /// green.agilemapper.test.contactwaydto collection warp domainobj green.agilemapper.test.contactway collection;

        /// <param name="fromobj">green.agilemapper.test.contactwaydto collection</param>

        /// <param name="domainobj">green.agilemapper.test.contactway collection</param>      

        public static void warp(this ilist<green.agilemapper.test.contactwaydto> fromobj, ilist<green.agilemapper.test.contactway> domainobj)

            fromobj.warp(domainobj, (fromobjitem, domainobjitem) => fromobjitem.equals(domainobjitem), false);

        /// <param name="domainobj">green.agilemapper.test.contactway collection</param>

        public static void warp(this ilist<green.agilemapper.test.contactwaydto> fromobj, ilist<green.agilemapper.test.contactway> domainobj, bool isdeletenotinfromitem)

            fromobj.warp(domainobj, (fromobjitem, domainobjitem) => fromobjitem.equals(domainobjitem), isdeletenotinfromitem);

        public static void warp(this ilist<green.agilemapper.test.contactwaydto> fromobj, ilist<green.agilemapper.test.contactway> domainobj, func<green.agilemapper.test.contactwaydto, green.agilemapper.test.contactway, bool> equalpredicate)

        /// <param name="domainobj">green.agilemapper.test.contactway collection</param> 

        public static void warp(this ilist<green.agilemapper.test.contactwaydto> fromobj, ilist<green.agilemapper.test.contactway> domainobj, func<green.agilemapper.test.contactwaydto, green.agilemapper.test.contactway, bool> equalpredicate, bool isdeletenotinfromitem)

                domainobj = new list<green.agilemapper.test.contactway>();

                green.agilemapper.test.contactway toitem = default(green.agilemapper.test.contactway);

                    toitem = new green.agilemapper.test.contactway();

Green.AgileMapper項目(2)-新增DO和DTO代碼生成

3.cs: 

Green.AgileMapper項目(2)-新增DO和DTO代碼生成
Green.AgileMapper項目(2)-新增DO和DTO代碼生成

        /// green.agilemapper.test.keyvaluepairdto  warp fromobj green.agilemapper.test.keyvaluepair;

        /// <param name="domainobj">green.agilemapper.test.keyvaluepair</param>

        /// <returns>green.agilemapper.test.keyvaluepairdto</returns>

        public static green.agilemapper.test.keyvaluepairdto warp(this green.agilemapper.test.keyvaluepair domainobj)

            var fromobj = new green.agilemapper.test.keyvaluepairdto();

            fromobj.key = domainobj.key;

            fromobj.value = domainobj.value;

        /// green.agilemapper.test.keyvaluepairdto  warp domainobj green.agilemapper.test.keyvaluepair;

        public static void warp(this green.agilemapper.test.keyvaluepairdto fromobj, green.agilemapper.test.keyvaluepair domainobj)

                domainobj = new green.agilemapper.test.keyvaluepair();

            domainobj.key = fromobj.key;

            domainobj.value = fromobj.value;

        /// green.agilemapper.test.keyvaluepairdto collection warp fromobj green.agilemapper.test.keyvaluepair collection;

        /// <param name="form">green.agilemapper.test.keyvaluepairdto collection</param>

        /// <param name="domainobj">green.agilemapper.test.keyvaluepair collection</param>        

        public static list<green.agilemapper.test.keyvaluepairdto> warp(this ilist<green.agilemapper.test.keyvaluepair> domainobj)

            list<green.agilemapper.test.keyvaluepairdto> froms = new list<green.agilemapper.test.keyvaluepairdto>();

        /// green.agilemapper.test.keyvaluepairdto collection warp domainobj green.agilemapper.test.keyvaluepair collection;

        /// <param name="fromobj">green.agilemapper.test.keyvaluepairdto collection</param>

        /// <param name="domainobj">green.agilemapper.test.keyvaluepair collection</param>      

        public static void warp(this ilist<green.agilemapper.test.keyvaluepairdto> fromobj, ilist<green.agilemapper.test.keyvaluepair> domainobj)

        /// <param name="domainobj">green.agilemapper.test.keyvaluepair collection</param>

        public static void warp(this ilist<green.agilemapper.test.keyvaluepairdto> fromobj, ilist<green.agilemapper.test.keyvaluepair> domainobj, bool isdeletenotinfromitem)

        public static void warp(this ilist<green.agilemapper.test.keyvaluepairdto> fromobj, ilist<green.agilemapper.test.keyvaluepair> domainobj, func<green.agilemapper.test.keyvaluepairdto, green.agilemapper.test.keyvaluepair, bool> equalpredicate)

        /// <param name="domainobj">green.agilemapper.test.keyvaluepair collection</param> 

        public static void warp(this ilist<green.agilemapper.test.keyvaluepairdto> fromobj, ilist<green.agilemapper.test.keyvaluepair> domainobj, func<green.agilemapper.test.keyvaluepairdto, green.agilemapper.test.keyvaluepair, bool> equalpredicate, bool isdeletenotinfromitem)

                domainobj = new list<green.agilemapper.test.keyvaluepair>();

                green.agilemapper.test.keyvaluepair toitem = default(green.agilemapper.test.keyvaluepair);

                    toitem = new green.agilemapper.test.keyvaluepair();

Green.AgileMapper項目(2)-新增DO和DTO代碼生成

繼續閱讀