我有一个SearchService
,其Search()
方法可以从存储库中检索IEnumerable<Search>
。这些Search
对象直接来自LINQ To SQL。接下来我使用AutoMapper将这些Search
类型转换为SearchModel
类型(稍后它们会被传递到控制器中)。
var searches = searchRepository.GetByUserID(userID);
var models = Mapper.Map<IEnumerable<Search>, IEnumerable<SearchModel>>(searches);
问题是Search
的属性DateCreated
是UTC DateTime
。我需要根据登录用户的当地时区更正日期。我可以在服务中使用foreach
执行此操作,如下所示:
var searches = searchRepository.GetByUserID(userID);
foreach (var search in searches)
{
search.DateCreated = search.DateCreated.ToTimezone(userTimezoneID);
}
var models = Mapper.Map<IEnumerable<Search>, IEnumerable<SearchModel>>(searches);
虽然这有效(并且可能是唯一的选择),但我想使用AutoMapper的IValueFormatter
。例如,我有一些其他值格式化程序用于相对时间等。
我的问题是:这可以吗?我不确定,因为我想我需要将其他信息传递给AutoMapper,以便它知道用于进行转换的时区ID。
我也试图避免从Search
- &gt;中获取此信息。 User
关系,因为我在用户登录时将其存储在cookie中(并且希望避免数据库JOIN检索它)。如何将此时区ID传递给AutoMapper,以便它可以为每个用户执行自定义映射?
答案 0 :(得分:5)
我想你会想要将AutoMapper与Custom Resolver一起使用。您的自定义解析将支持依赖注入。如果您使用IoC,它最有效,但您可以将用户注入解析器并在ResolveCore方法中执行适当的逻辑。这是一个粗略的例子:
private readonly IUserContext _userContext;
public MyResolver(IUserContext userContext)
{
_userContext = userContext;
}
protected override String ResolveCore(object source)
{
// Calculate display date based on user context
return TheDate;
}
但请查看自定义解析器文档。
我希望它有所帮助。