使用MappingEngine会抛出异常

时间:2013-12-03 18:31:17

标签: automapper

我正在维护一个使用AutoMapper的应用程序:

public class UserDomainService
{
    public UserDTO GetUser(int id)
    { 
         Mapper.Reset();
         Mapper.CreateMap<User, UserDTO>();
         var user = ....;
         return Mapper.Map<User, UserDTO>(user);
    }
}

此域服务由网络服务使用。

我认为当两个Web服务请求进入并且在单独的线程上调用Reset和Map时,这可能是一个问题。

Mapper可能会处于Map()失败的状态。

我知道我应该在Application_Start中设置CreateMap()映射,但是现在我正在尝试这样做:

public class UserDomainService
{
    public UserDTO GetUser(int id)
    { 
         var config = new AutoMapper.Configuration(new TypeMapFactory(), MapperRegistry.AllMappers());
         config.CreateMap<User, UserDTO>();
         var mapper = new MappingEngine(configuration);
         var user = ....;
         return mapper.Map<User, UserDTO>(user);
    }
}

暂且没有性能,是否有可能导致应用程序崩溃? 有时我得到这样的例外:

System.ArgumentException: An item with the same key has already been added.
   at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
   at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
   at System.Collections.Generic.Dictionary`2.Add(TKey key, TValue value)
   at AutoMapper.TypeMapFactory.GetTypeInfo(Type type)
   at AutoMapper.TypeMapFactory.CreateTypeMap(Type sourceType, Type destinationType, IMappingOptions options)
   at AutoMapper.Configuration.CreateTypeMap(Type source, Type destination, String profileName)
   at AutoMapper.Configuration.CreateMap[TSource,TDestination](String profileName)
   at AutoMapper.Configuration.CreateMap[TSource,TDestination]()

请注意,上面的示例映射只是一个示例。

我在3.5 Net应用中使用AutoMapper v1.1.0.188。

修改 有一个特定的原因让我把配置放在Application_Start中并不容易。 根据上下文,我有不同的映射要求。例如,对于同一个User to UserDTO,我需要两种不同类型的映射。

这是旧问题中描述的问题:

Link

1 个答案:

答案 0 :(得分:0)

https://github.com/AutoMapper/AutoMapper/wiki/Getting-started

我在哪里配置AutoMapper?

如果您使用静态Mapper方法,则每个AppDomain只应进行一次配置。这意味着放置配置代码的最佳位置是应用程序启动,例如ASP.NET应用程序的Global.asax文件。通常,配置引导程序类在其自己的类中,并且从启动方法调用此引导程序类。