2010-08-10 137 views
2

我有一个SearchServiceSearch()方法,从存储库检索IEnumerable<Search>。这些对象直接来自LINQ To SQL。接下来,我使用AutoMapper将这些Search类型转换为SearchModel类型(例如,稍后将它们传递到控制器中)。AutoMapper:用户特定映射

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 - >User的关系中获得这个关系,因为当用户登录时(并且希望避免数据库JOIN检索它),我将它存储在cookie中。如何将此时区ID传递给AutoMapper,以便它可以为每个用户执行自定义映射?

回答

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

绝对检查出自定义解析器文档,虽然。

我希望它有帮助。