【问题标题】:AutoMapper passing extra arguments while mappingAutoMapper 在映射时传递额外的参数
【发布时间】:2011-11-11 16:11:13
【问题描述】:

我成功地使用 AutoMapper 在我的所有服务中将我的业务对象转换为 Dtos,效果非常好。

但是我也想使用 automapper 来做相反的事情,即将 dto 转换为业务对象,但是有一个问题,我需要在映射之前运行一些依赖于我的 EF 实体上下文的自定义逻辑

为此,我想以某种方式将我的 EF 上下文传递给 map 方法。我知道我可以使用服务定位器类型模式来解决依赖关系,但我讨厌引入魔法依赖,并且想让所有构造函数都依赖。

是否可以在映射时将我的 dataContext 传递给 AutoMapper?

【问题讨论】:

  • 以防万一其他人遇到这种情况,解决方案在新的 2.0 自动映射器中,这是作者的帖子lostechies.com/jimmybogard/2011/09/29/… 虽然我无法调用我的构造函数逻辑..跨度>

标签: c# automapper


【解决方案1】:

一种可能的方式可能是这样的:

using (Context db = new Context())
{
    Mapper.CreateMap<dtos, Ent>()
          .BeforeMap((a, b) => /* and here use db */ )
          ./* mapping rules */;

}

使用 Countext 声明映射,它应该使上下文在 BeforeMap() 中可见,您可以在其中执行逻辑。

【讨论】:

  • 想知道这是否会导致一些性能问题,因为我最终会在每个数据库上下文创建中为我的整个域模型创建映射?
  • 是的,但是您可以在之前检查映射:如果映射不存在,Mapper.FindTypeMapFor(typeof(dtos), typeof(Ent)) 将返回 null
  • 如果我之前检查过并且映射已经存在,那么我将无法在当前上下文中创建引用正确的数据库上下文实例的映射,对吧?
  • 请注意,这不是线程安全的,这样的映射会在 ASP.NET 或 WCF 等共享环境中中断,因为不同的请求会覆盖相同的全局映射配置。如果您需要这样做,您必须停止使用静态 Mapper 并使用 IMappingEngine 的实例...还请注意,如果您沿着这条路线走,您几乎可以手动完成所有操作,因为您必须处理从集合中删除,身份映射等手动... AutoMapper 只是让这更难
猜你喜欢
  • 1970-01-01
  • 2014-01-19
  • 1970-01-01
  • 1970-01-01
  • 2011-09-21
  • 1970-01-01
  • 2011-07-17
  • 2015-10-23
  • 1970-01-01
相关资源
最近更新 更多