zoukankan      html  css  js  c++  java
  • 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篇)。

     image

    我们看看单元测试看看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:

    View Code
    namespace Green.AgileMapper.Test 

        using System; 
        using System.Collections.Generic; 
        using System.Linq; 
        using System.Text; 
        [System.SerializableAttribute()] 
        public class StudenDoDTO : System.ComponentModel.INotifyPropertyChanged, System.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(thisnew 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<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 < 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:代码生成技术-目录

  • 相关阅读:
    (15)疯狂的程序员----《绝影》
    (14)嵌入式软件开发工程师技能要求总结
    (13)碎片化阅读只会让你变得越来越愚蠢
    (12)QT中搭建opencv开发环境
    (11)git服务器的安装和配置
    (10)python学习笔记一
    (3.3)狄泰软件学院C++课程学习剖析四
    (9)Linux下gdb调试学习
    (8)Linux(客户端)和Windows(服务端)下socket通信实例
    springMVC伪静态
  • 原文地址:https://www.cnblogs.com/whitewolf/p/ObjectPickUper.html
Copyright © 2011-2022 走看看