我正在维护一个使用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,我需要两种不同类型的映射。
这是旧问题中描述的问题:
答案 0 :(得分:0)
https://github.com/AutoMapper/AutoMapper/wiki/Getting-started
我在哪里配置AutoMapper?
如果您使用静态Mapper方法,则每个AppDomain只应进行一次配置。这意味着放置配置代码的最佳位置是应用程序启动,例如ASP.NET应用程序的Global.asax文件。通常,配置引导程序类在其自己的类中,并且从启动方法调用此引导程序类。