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

介绍Green.AgileMapper项目中的ObjectPickUper模块,该模块用于从领域对象(DO)生成数据传输对象(DTO)。通过CodeDom实现多语言代码生成,并通过策略模式支持不同的对象抽取算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  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

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

其他相关博文:

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

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

3:代码生成技术-目录


本文转自破狼博客园博客,原文链接:http://www.cnblogs.com/whitewolf/archive/2012/04/05/ObjectPickUper.html,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值