Green.AgileMapper新增-Green.ObjectPickUper(do到dto对象的默认抽取)
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.ObjectPickUper的简洁书写:
测试do对象仍是原对象StudentDo,参考CodePlex http://agilemapper.codeplex.com/
[TestMethod] publicvoidObjectPickUper_GenCode_Test() { ObjectPickUperManager.Instance.IsSOAObject=false; varstr=ObjectPickUperManager.Instance.PickUp<StudenDo>("DTO"); varstr1=ObjectPickUperManager.Instance.PickUp<ContactWay>("DTO"); varstr2=ObjectPickUperManager.Instance.PickUp<KeyValuePair>("DTO"); Assert.IsTrue(!string.IsNullOrEmpty(str)); //验证编译是否正确 CompilerParametersoption=newCompilerParameters(); 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); varresult=CodeDomProvider.CreateProvider("c#").CompileAssemblyFromSource(option,str,str1,str2); varassembly=result.CompiledAssembly; Assert.IsFalse(result.Errors.HasErrors,"编译错误"); }
这里采用CodeDom动态编译,查看是否存在编译错误。
生成dto:
namespaceGreen.AgileMapper.Test { usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; [System.SerializableAttribute()] publicclassStudenDoDTO:System.ComponentModel.INotifyPropertyChanged,System.ICloneable { privateint_ID; privateGreen.AgileMapper.Test.Sex_Sex; privateSystem.Collections.Generic.List<System.String>_CourseIds; privatestring_AddressCountry; privatestring_AddressProvince; privatestring_AddressStreet; privatestring_AddressParticular; privateGreen.AgileMapper.Test.ContactWayDTO_ContactWay; privateSystem.Collections.Generic.List<Green.AgileMapper.Test.KeyValuePairDTO>_Propertys; publicintID { get { returnthis._ID; } set { if((this._ID!=value)) { this._ID=value; this.OnNotifyPropertyChanged("ID"); } } } publicGreen.AgileMapper.Test.SexSex { get { returnthis._Sex; } set { if((this._Sex!=value)) { this._Sex=value; this.OnNotifyPropertyChanged("Sex"); } } } [Green.AgileMapper.CollectionMappingAttribute(Name="CourseIds",IsConvertTo=true,IsConvertFrom=true,IsDeleteNotInFromItem=true)] publicSystem.Collections.Generic.List<System.String>CourseIds { get { returnthis._CourseIds; } set { if((this._CourseIds!=value)) { this._CourseIds=value; this.OnNotifyPropertyChanged("CourseIds"); } } } [Green.AgileMapper.MappingAttribute(Name="Address.Country",IsConvertTo=true,IsConvertFrom=true)] publicstringAddressCountry { get { returnthis._AddressCountry; } set { if((this._AddressCountry!=value)) { this._AddressCountry=value; this.OnNotifyPropertyChanged("AddressCountry"); } } } [Green.AgileMapper.MappingAttribute(Name="Address.Province",IsConvertTo=true,IsConvertFrom=true)] publicstringAddressProvince { get { returnthis._AddressProvince; } set { if((this._AddressProvince!=value)) { this._AddressProvince=value; this.OnNotifyPropertyChanged("AddressProvince"); } } } [Green.AgileMapper.MappingAttribute(Name="Address.Street",IsConvertTo=true,IsConvertFrom=true)] publicstringAddressStreet { get { returnthis._AddressStreet; } set { if((this._AddressStreet!=value)) { this._AddressStreet=value; this.OnNotifyPropertyChanged("AddressStreet"); } } } [Green.AgileMapper.MappingAttribute(Name="Address.Particular",IsConvertTo=true,IsConvertFrom=true)] publicstringAddressParticular { get { returnthis._AddressParticular; } set { if((this._AddressParticular!=value)) { this._AddressParticular=value; this.OnNotifyPropertyChanged("AddressParticular"); } } } [Green.AgileMapper.ObjectMappingAttribute(Name="ContactWay")] publicGreen.AgileMapper.Test.ContactWayDTOContactWay { get { returnthis._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)] publicSystem.Collections.Generic.List<Green.AgileMapper.Test.KeyValuePairDTO>Propertys { get { returnthis._Propertys; } set { if((this._Propertys!=value)) { this._Propertys=value; this.OnNotifyPropertyChanged("Propertys"); } } } publiceventSystem.ComponentModel.PropertyChangedEventHandlerPropertyChanged; publicvoidOnNotifyPropertyChanged(stringproperty) { if((this.PropertyChanged!=null)) { this.PropertyChanged(this,newSystem.ComponentModel.PropertyChangedEventArgs(property)); } } publicobjectClone() { StudenDoDTOcloneObj; cloneObj=newStudenDoDTO(); cloneObj._ID=this.ID; cloneObj._Sex=this.Sex; System.Collections.Generic.List<System.String>CourseIdsList; CourseIdsList=newSystem.Collections.Generic.List<System.String>(); if((this.CourseIds!=null)) { inti; 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<Green.AgileMapper.Test.KeyValuePairDTO>PropertysList; PropertysList=newSystem.Collections.Generic.List<Green.AgileMapper.Test.KeyValuePairDTO>(); if((this.Propertys!=null)) { inti; for(i=0;(i<this.Propertys.Count);i=(i+1)) { PropertysList.Add(((Green.AgileMapper.Test.KeyValuePairDTO)(this.Propertys[i].Clone()))); } } cloneObj._Propertys=PropertysList; returncloneObj; } } }
源代码参加:CodePlex http://agilemapper.codeplex.com/
其他相关博文:
1:Green.AgileMapper开源项目的使用(1)
2:Green.AgileMapper项目(2)-新增DO和DTO代码生成
3:代码生成技术-目录
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。