AutoMapper: пользовательское сопоставление - PullRequest
2 голосов
/ 11 августа 2010

У меня есть 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);

Хотя это работает (и может быть единственным вариантом), я бы хотел использовать IValueFormatter в AutoMapper.У меня есть несколько других форматеров значений для таких вещей, как относительное время, например.

Мой вопрос: это можно сделать?Я не уверен, потому что думаю, что мне нужно было бы передать дополнительную информацию в AutoMapper, чтобы он знал, какой идентификатор часового пояса использовать для преобразования.

Я также пытался избежать этого из отношения Search -> User, так как я бы сохранял его в файле cookie, когда пользователь входит в систему (и хотел бы избежать присоединения базы данных JOIN).в получении его).Как передать этот идентификатор часового пояса в AutoMapper, чтобы он мог выполнять настраиваемое сопоставление для пользователя?

1 Ответ

5 голосов
/ 11 августа 2010

Я думаю, вы захотите использовать 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;
}

Обязательно ознакомьтесь с документами для пользовательского резольвера.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...