温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Green.AgileMapper新增-Green.ObjectPickUper(do到dto对象的默认抽取)

发布时间:2020-06-19 22:40:05 阅读:580 作者:破狼 栏目:编程语言
开发者测试专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

     Green.AgileMapper意在处理领域驱动开发中对象之间的Mapper(如果你还不了解Green.AgileMapper,从这里开始Green.AgileMapper开源项目的使用(1) 和Green.AgileMapper项目(2)-新增DO和DTO代码生成,项目地址:CodePlex http://agilemapper.codeplex.com/),本项目在后期会针对领域建模提供设计时候支持,利用EF和NHibernate作为底层ORM框架产生自己的领域框架,在设计时才会采用这些组件。

    在我们的领域驱动开发中,DomainObject(领域对象)是一个自然oo对象,存在许多现实世界的关系关联,在我们的View端一个View却可能需要数据并不是所有关联。经常除非特殊的UI模式,我们ViewObject往往都会被弱化,而利用Data Transfer Object代替。我们的dto从do抽取大多时候都是将do 单一Object平面化,对于级联删除更新的集合抽取,非级联集合放弃。Green.ObjectPickUper就是一种由do抽取dto的实现策略,产生符合Green.AgileMapper 映射规则的dto对象。对象抽取可能存在多样性,这里只是实现了默认抽取规则,可能不能满足你的需求,你不需要急,因为在这里采用了策略模式来满足不同抽取算法的需求(ObjectPickUperBase),Green.ObjectPickUper并不依赖Green.AgileMapper你可以自由抽取。

  在Green.ObjectPickUper中利用了CodeDom实现代码生成,所以可以支持多语言(如果你还不了解CodeDom可以看这里代码生成技术-目录中CodeDom篇)。

Green.AgileMapper新增-Green.ObjectPickUper(do到dto对象的默认抽取)

我们看看单元测试看看Green.ObjectPickUper的简洁书写:

测试do对象仍是原对象StudentDo,参考CodePlex http://agilemapper.codeplex.com/

[TestMethod]         public void ObjectPickUper_GenCode_Test()         {             ObjectPickUperManager.Instance.IsSOAObject = false;             var str = ObjectPickUperManager.Instance.PickUp<StudenDo>("DTO");             var str1 = ObjectPickUperManager.Instance.PickUp<ContactWay>("DTO");             var str2 = ObjectPickUperManager.Instance.PickUp<KeyValuePair>("DTO");              Assert.IsTrue(!string.IsNullOrEmpty(str));              //验证编译是否正确             CompilerParameters option = new CompilerParameters();             option.GenerateExecutable = false;             option.GenerateInMemory = true;             option.IncludeDebugInformation = false;             option.ReferencedAssemblies.Add("System.dll");             option.ReferencedAssemblies.Add(typeof(System.Linq.IQueryable).Assembly.Location);             option.ReferencedAssemblies.Add(typeof(StudenDo).Assembly.Location);             option.ReferencedAssemblies.Add(typeof(Green.AgileMapper.CollectionMappingAttribute).Assembly.Location);              var result = CodeDomProvider.CreateProvider("c#").CompileAssemblyFromSource(option, str, str1, str2);             var assembly = result.CompiledAssembly;             Assert.IsFalse(result.Errors.HasErrors, "编译错误");         }  

这里采用CodeDom动态编译,查看是否存在编译错误。

生成dto:

namespace Green.AgileMapper.Test   {       using System;       using System.Collections.Generic;       using System.Linq;       using System.Text;       [System.SerializableAttribute()]       public class StudenDoDTO : System.ComponentModel.INotifyPropertyChangedSystem.ICloneable       {           private int _ID;           private Green.AgileMapper.Test.Sex _Sex;           private System.Collections.Generic.List<System.String> _CourseIds;           private string _AddressCountry;           private string _AddressProvince;           private string _AddressStreet;           private string _AddressParticular;           private Green.AgileMapper.Test.ContactWayDTO _ContactWay;           private System.Collections.Generic.List<Green.AgileMapper.Test.KeyValuePairDTO> _Propertys;           public int ID           {               get               {                   return this._ID;               }               set               {                   if ((this._ID != value))                   {                       this._ID = value;                       this.OnNotifyPropertyChanged("ID");                   }               }           }           public Green.AgileMapper.Test.Sex Sex           {               get               {                   return this._Sex;               }               set               {                   if ((this._Sex != value))                   {                       this._Sex = value;                       this.OnNotifyPropertyChanged("Sex");                   }               }           }           [Green.AgileMapper.CollectionMappingAttribute(Name="CourseIds", IsConvertTo=true, IsConvertFrom=true, IsDeleteNotInFromItem=true)]           public System.Collections.Generic.List<System.String> CourseIds           {               get               {                   return this._CourseIds;               }               set               {                   if ((this._CourseIds != value))                   {                       this._CourseIds = value;                       this.OnNotifyPropertyChanged("CourseIds");                   }               }           }           [Green.AgileMapper.MappingAttribute(Name="Address.Country", IsConvertTo=true, IsConvertFrom=true)]           public string AddressCountry           {               get               {                   return this._AddressCountry;               }               set               {                   if ((this._AddressCountry != value))                   {                       this._AddressCountry = value;                       this.OnNotifyPropertyChanged("AddressCountry");                   }               }           }           [Green.AgileMapper.MappingAttribute(Name="Address.Province", IsConvertTo=true, IsConvertFrom=true)]           public string AddressProvince           {               get               {                   return this._AddressProvince;               }               set               {                   if ((this._AddressProvince != value))                   {                       this._AddressProvince = value;                       this.OnNotifyPropertyChanged("AddressProvince");                   }               }           }           [Green.AgileMapper.MappingAttribute(Name="Address.Street", IsConvertTo=true, IsConvertFrom=true)]           public string AddressStreet           {               get               {                   return this._AddressStreet;               }               set               {                   if ((this._AddressStreet != value))                   {                       this._AddressStreet = value;                       this.OnNotifyPropertyChanged("AddressStreet");                   }               }           }           [Green.AgileMapper.MappingAttribute(Name="Address.Particular", IsConvertTo=true, IsConvertFrom=true)]           public string AddressParticular           {               get               {                   return this._AddressParticular;               }               set               {                   if ((this._AddressParticular != value))                   {                       this._AddressParticular = value;                       this.OnNotifyPropertyChanged("AddressParticular");                   }               }           }           [Green.AgileMapper.ObjectMappingAttribute(Name="ContactWay")]           public Green.AgileMapper.Test.ContactWayDTO ContactWay           {               get               {                   return this._ContactWay;               }               set               {                   if ((this._ContactWay != value))                   {                       this._ContactWay = value;                       this.OnNotifyPropertyChanged("ContactWay");                   }               }           }           [Green.AgileMapper.CollectionMappingAttribute(Name="Propertys", IsConvertTo=true, IsConvertFrom=true, IsDeleteNotInFromItem=true, EqualExpression=null)]           public System.Collections.Generic.List<Green.AgileMapper.Test.KeyValuePairDTO> Propertys           {               get               {                   return this._Propertys;               }               set               {                   if ((this._Propertys != value))                   {                       this._Propertys = value;                       this.OnNotifyPropertyChanged("Propertys");                   }               }           }           public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;           public void OnNotifyPropertyChanged(string property)           {               if ((this.PropertyChanged != null))               {                   this.PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(property));               }           }           public object Clone()           {               StudenDoDTO cloneObj;               cloneObj = new StudenDoDTO();               cloneObj._ID = this.ID;               cloneObj._Sex = this.Sex;               System.Collections.Generic.List<System.String> CourseIdsList;               CourseIdsList = new System.Collections.Generic.List<System.String>();               if ((this.CourseIds != null))               {                   int i;                   for (i = 0; (i < this.CourseIds.Count); i = (i + 1))                   {                       CourseIdsList.Add(this.CourseIds[i]);                   }               }               cloneObj._CourseIds = CourseIdsList;               cloneObj._AddressCountry = this.AddressCountry;               cloneObj._AddressProvince = this.AddressProvince;               cloneObj._AddressStreet = this.AddressStreet;               cloneObj._AddressParticular = this.AddressParticular;               cloneObj._ContactWay = ((Green.AgileMapper.Test.ContactWayDTO)(this.ContactWay.Clone()));               System.Collections.Generic.List&lt;Green.AgileMapper.Test.KeyValuePairDTO> PropertysList;               PropertysList = new System.Collections.Generic.List<Green.AgileMapper.Test.KeyValuePairDTO>();               if ((this.Propertys != null))               {                   int i;                   for (i = 0; (i &lt; this.Propertys.Count); i = (i + 1))                   {                       PropertysList.Add(((Green.AgileMapper.Test.KeyValuePairDTO)(this.Propertys[i].Clone())));                   }               }               cloneObj._Propertys = PropertysList;               return cloneObj;           }       }   }   

源代码参加:CodePlex http://agilemapper.codeplex.com/

其他相关博文:

1:Green.AgileMapper开源项目的使用(1)

2:Green.AgileMapper项目(2)-新增DO和DTO代码生成

3:代码生成技术-目录

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI

开发者交流群×