【问题标题】:Object to Object Mapping Utility对象到对象映射实用程序
【发布时间】:2010-10-26 14:52:33
【问题描述】:

我喜欢将公共和域对象(因此,nHibernate 不会在这里提供帮助)彼此清晰地分开,这最终迫使我编写大量代码来将一个对象映射到其他。有哪些工具/插件可以消除在 .NET 中手动执行此映射的乏味?m 每当我 Google 搜索此内容时,它都会认为我想做 ORM,这 不是我在找。谢谢!

编辑 19:33CST:好的,我编写了一个非常基本的应用程序(非常快速编写的代码)来演示我正在寻找的内容。我只是想知道是否有一个 VS 插件可以为我做到这一点。

VS2008 Solution

【问题讨论】:

  • 也许使用具有强大元编程支持的language 是合适的?适合工作的正确工具,嗯?
  • 为了这个问题,您为什么要寻找可能会导致脆弱测试的静态代码生成解决方案,而不是像 AutoMapper 这样的较低级别的基础架构解决方案?

标签: c# .net visual-studio oop


【解决方案1】:

您可能想试试AutoMapper。这听起来像您正在寻找的东西。

【讨论】:

  • +1 - 很好的链接,非常感谢!这可以在我的代码中节省无数左右赋值块! :-)
  • 我在发帖之前确实看过它,但看起来你仍然必须编写代码——我真的希望它自动生成它,即使这意味着我在属性之间拖放点到告诉它对象如何映射。这比敲出样板代码要快得多。
  • @wayne,只要您的对象遵循一些命名约定,Automapper 就会自动计算出映射。否则,您需要预先进行更多配置,但这仍然是一个胜利。我不确定您还想要自动生成什么?
  • @Gabe Moothart,试过了;文档很少。尽管如此,我更多的是寻找静态代码生成,而不是运行时工具。在设计时直接映射有运行时效率,而不是通过他的代码运行它每次它需要在运行时进行映射。这有意义吗?
  • 运行时效率吧?谁能说过早优化?
【解决方案2】:

还有一个有趣的项目叫做Otis。以下是从文档页面获取的 *.otis.xml 映射示例:

<?xml version="1.0" encoding="utf-8" ?> 
<otis-mapping xmlns="urn:otis-mapping-1.0">
<class name="Otis.Tests.UserDTO, Otis.Tests" source="Otis.Tests.Entity.User, Otis.Tests" >
    <member name="Id" />
    <member name="Age" />
    <member name="UserName" expression="$UserName.ToUpper()" nullValue="[unknown]" />
    <member name="FullName" expression="[$FirstName + ' ' + $LastName]" />
    <member name="ProjectCount" expression="$Projects.Count" />
    <member name="Title" expression="$Gender" >
        <map from="Gender.Male" to="Mr." />     <!-- projections -->
        <map from="Gender.Female" to="Mrs." />
    </member> 
    <member name="Birthday"  expression="$BirthDate" format="Born on {0:D}"/>
    <member name="ProjectCount" expression="$Projects.Count" />
    <member name="AvgTaskDuration" expression="avg:$Projects/Tasks/Duration" />
    <member name="MaxTaskDuration" expression="max:$Projects/Tasks/Duration" />             
</class>

从程序集中读取映射文件:

// configure the new Configuration object using metadata of types in the current assembly
Configuration cfg = new Configuration();            // instantiate a new Configuration, one per application is needed
cfg.AddAssembly(Assembly.GetExecutingAssembly());   // initialize it

嗯,我以前在哪里见过它? ;)

【讨论】:

【解决方案3】:

因此,我似乎对运行时解决方案不满意,因此编写了一个小实用程序,可以在代码中创建映射。您可以下载下面的源代码并编写更好的错误处理等。我很感激您所做的任何很酷的修改,这是匆忙做出的,但有效。请尊重代码在LGPL下发布。

Object To Object Mapping Utility Source Code

2009 年 6 月 23 日更新:我对清理它的代码进行了一些更新(一点点),还添加了将映射保存到文件的功能,以便您以后可以修改它.

【讨论】:

  • 我发现这很有用,但想进行一些更改。我已经上传到github.com/Swoogan/otom。请注意,您在原始 zip 中没有许可证或版权信息。
  • @Swoogan 哇!我很久以前写的。很高兴你发现它有用!感谢您的提醒。
【解决方案4】:

使用ValueInjecter,你可以将任何东西映射到任何东西,例如

  • 对象 对象
  • 对象 表单/WebForm
  • DataReader -> 对象

它具有很酷的功能,例如:扁平化和非扁平化

【讨论】:

  • 重点不是写代码,因为这些是静态映射。这个想法是所有正在发生的事情都是从右到左的分配,所以(恕我直言)它不值得任何反思,运行时体操等等。随心所欲地敲响“过早的优化”锣,但是在编译时与运行时相比,效率非常。我已经看到像 Dozer(用于 Java)这样的库只是为了像从右到左分配这样简单的事情而消耗 CPU。
  • @Wayne Hartman 我对效率没有任何问题,它使用 TypeDescriptor,我编写了测试,其中 100 万个映射在 2 秒内完成,所以我不认为速度/内存/ cpu 是个问题
猜你喜欢
  • 1970-01-01
  • 2019-09-19
  • 1970-01-01
  • 1970-01-01
  • 2013-10-12
  • 2014-11-07
  • 2012-07-18
  • 2022-11-24
  • 2019-05-27
相关资源
最近更新 更多