【问题标题】:PostSharp for an object mapperPostSharp 用于对象映射器
【发布时间】:2009-05-30 04:09:48
【问题描述】:

我正在考虑将 PostSharp 用于实体到 DTO 和 DTO 到实体的映射器。为大约 100 个实体手动执行该任务将是维护的噩梦。我在 codeplex 上查看了 AutoMapper,但我认为开销在我的情况下可能是一个严重的问题,此外我觉得 PostSharp 可以让我对映射约定进行一些额外的控制。如果有人能分享这个问题之王的经验,那就太好了。

我认为的方向是这样的(如果这不可能,请有人告诉我):

我打算坚持一个类的方面将用内容填充接下来的两个方法:

EntityType EntityToDTO(DTOType DTO) {}

DTOType DTOToEntity(EntityType Entity) {}

第一种方法会根据 DTO 返回实体,第二种方法则相反。在我计划遍历每个属性的方面内,创建新目标并将属性的值分配给目标对象的对应项。这是否可以在编译时执行而无需任何运行时开销?

【问题讨论】:

  • 为什么开销是个问题?你测量了吗?
  • 你所说的可以通过简单的反思轻松完成。反射在性能上的评价很差,但老实说,它并没有你想象的那样对性能造成影响。在 .Net 框架中到处都使用反射来处理很多事情。除非你做的事情需要令人麻木的速度,否则反思应该很好地为你服务。从数据库和网络中获取信息所需的时间比一点点反射要慢得多。整个性能是最能感知的。

标签: c# aop postsharp


【解决方案1】:

如果您的 DTO 字段名称与您的实体字段名称匹配,那么我会使用 Duck Typing

http://www.deftflux.net/blog/page/Duck-Typing-Project.aspx

http://haacked.com/archive/2007/08/19/why-duck-typing-matters-to-c-developers.aspx

你的代码会像这样工作

UserDTO user = DuckTyping.Cast<UserDTO>(userEntity);

基本上,duck 类型库将通过匹配名称来映射字段。他们使用动态生成的 IL 来归档它。

如果这有可能太慢,我可能会尝试让 CodeSmith 为我生成方法。

【讨论】:

    【解决方案2】:

    如果有帮助,有一个名为 PostSharp4ET 的项目,它基本上实现了对 Entity Framework 1 的 POCO 对象的支持。请参阅http://www.codeplex.com/efcontrib

    请注意,PostSharp 不擅长生成新代码。它擅长将新代码与现有代码混合。如果您需要生成代码,我建议您编写一个基于反射的 C# 代码生成器,并编译生成的代码。或者使用 CodeSmith 之类的工具,如前所述。

    【讨论】:

      猜你喜欢
      • 2013-10-12
      • 1970-01-01
      • 2019-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-14
      相关资源
      最近更新 更多