AutoMapper:用户特定映射

时间:2010-08-10 21:30:08

标签: c# automapper

我有一个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,以便它可以为每个用户执行自定义映射?

1 个答案:

答案 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;
}

但请查看自定义解析器文档。

我希望它有所帮助。