2010-08-10 4 views
2

У меня есть SearchService с методом Search(), который извлекает IEnumerable<Search> из репозитория. Эти объекты 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, чтобы он знал, какой идентификатор часового пояса использовать для преобразования.

Я также пытался избежать этого из Search ->User отношения, как я бы это хранится в куки, когда пользователь входит в систему (и хотел бы избежать базы данных РЕГИСТРИРУЙТЕСЬ в получении его). Как передать этот идентификатор часового пояса в 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; 
} 

Определенно проверяйте документы Custom Resolver.

Надеюсь, это поможет.