我在我的ASP.NET MVC网站中使用AutoMapper将我的数据库对象映射到ViewModel对象,我试图使用几个配置文件来映射相同的类型,但使用另一个逻辑.我想通过阅读Matt的博客文章这样做,他说:
真正关键的部分是AutoMapper配置文件.您可以使用配置文件对配置进 也许在一个配置文件中,您可以通过一种方式格式化日期,而在另一种配置文 我在这里只使用一个配置文件.
所以我为一个案例创建了一个配置文件:
public class MyProfile : Profile
{
protected override string ProfileName
{
get
{
return "MyProfile";
}
}
protected override void Configure()
{
CreateMap<DateTime, String>().ConvertUsing<StringFromDateTimeTypeConverter>();
}
}
public class StringFromDateTimeTypeConverter : ITypeConverter<DateTime, String>
{
public string Convert(DateTime source)
{
return source.ToString("dd/mm/yyyy", CultureInfo.InvariantCulture);
}
}
Run Code Online (Sandbox Code Playgroud)
还有另一个案例:
public class MyProfile2 : Profile
{
protected override string ProfileName
{
get
{
return "MyProfile2";
}
}
protected override void Configure()
{
CreateMap<DateTime, String>().ConvertUsing<AnotherStringFromDateTimeTypeConverter>();
}
}
public class …Run Code Online (Sandbox Code Playgroud) 与automapper有一些实际问题.我想我找到了解决方案但不确定如何实现它.
基本上我使用ResolveUsing和ConstructedBy的自定义映射将params传递给构造函数,我知道大多数人在global.asax中设置了一次而忘记了它.
但问题是我的方法(在wcf上)将不同的参数传递给ResolveUsing的构造函数......
在我使用静态方法的Mapper.CreateMap和Mapper.Map之前,看来当不同的请求通过方法(多用户)进入wcf服务时,它们彼此冲突.
看完之后,我可以使用CreateMap和Map的实例版本,这样每个请愿书都可以获得自己的地图,并可以传递自己的参数.
但我似乎无法找到如何做到这一点.有人可以解释一下吗?我真的被困了......
在一次又一次之前,我会得到重复的键错误,并且我在构造函数上添加了一个日志跟踪,看起来1请求覆盖了另一个 - 因此是静态版本的Mapper.
好吧,我希望我是对的,但我找不到别的......
编辑 - 我有什么例子
基本上所有映射都应该正常工作,因为我在大多数情况下使用MapFrom.
然后我创建一个我的Resolver实例,我在URL中传递.在我传递之前我检查了网址并且它是正确的.但是一旦它返回它就会返回错误的URL.
我需要在URL中传递的原因是它有变量,所以我需要替换变量...基本上有2个网址取决于办公室,我到处都有日志,我可以看到我传递的内容但是一次我把它传递进去 - 它不是我传入的那个,如果这是有道理的,这很奇怪!
它是一个WCF服务和一个客户端调用该方法两次传递到2个不同的办公室,因此2个不同的URL.但是它们总是返回相同的URL.就好像一个会话正在覆盖另一个会话......
我希望这是有道理的.
SalesPointResolver newSalesPointResolver = new SalesPointResolver(returnReservationUrl, reservationSite.ReservationUrl, startDate, endDate, officeCode);
Mapper.CreateMap<Models.Custom.House, DTO.House>()
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id))
.ForMember(dest => dest.TaxIncluded,
opt => opt.MapFrom(src => src.Segments.FirstOrDefault().TaxIncluded))
.ForMember(dest => dest.TaxPercentage,
opt => opt.MapFrom(src => src.Segments.FirstOrDefault().TaxPercentage))
.ForMember(dest => dest.SalesPoints,
opt =>
opt.ResolveUsing(newSalesPointResolver))
;
Run Code Online (Sandbox Code Playgroud)
找出失败的地方 - 但不知道为什么
请参阅我的评论内联代码.在构造函数中,urlTemplate到达,我将其保存在私有var中,然后在重写的ResolveCore中,它是另外的东西:-)
我已经在那里放了一些log4net日志,所以我可以看到发生了什么.
[Log]
public class SalesPointResolver : ValueResolver<Models.Custom.House, IList<DTO.SalesPoint>>
{
private readonly ILog log = …Run Code Online (Sandbox Code Playgroud)