AutoMapper: широкое использование IValueFormatter для определенных типов - PullRequest
1 голос
/ 06 мая 2010

Насколько я понимаю, я могу настроить AutoMapper следующим образом, и при отображении он должен форматировать все даты исходной модели в соответствии с правилами, определенными в IValueFormatter, и устанавливать результат в сопоставленной модели.

ForSourceType<DateTime>().AddFormatter<StandardDateFormatter>();
ForSourceType<DateTime?>().AddFormatter<StandardDateFormatter>();

Я не получаю эффекта для своего отображенного класса с этим. Это работает только тогда, когда я делаю следующее:

Mapper.CreateMap<Member, MemberForm>().ForMember(x => x.DateOfBirth, y => y.AddFormatter<StandardDateFormatter>());

Я сопоставляю DateTime? Member.DateOfBirth до string MemberForm.DateOfBirth . Форматировщик в основном создает короткую строку даты из даты.

Что-то мне не хватает при установке стандартного форматера для данного типа?

Спасибо

public class StandardDateFormatter : IValueFormatter
{
    public string FormatValue(ResolutionContext context)
    {
        if (context.SourceValue == null)
            return null;

        if (!(context.SourceValue is DateTime))
            return context.SourceValue.ToNullSafeString();

        return ((DateTime)context.SourceValue).ToShortDateString();
    }
}

Ответы [ 3 ]

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

У меня была такая же проблема и я нашел исправление. Попробуйте изменить:

ForSourceType<DateTime>().AddFormatter<StandardDateFormatter>();

Для

Mapper.ForSourceType<DateTime>().AddFormatter<StandardDateFormatter>();
2 голосов
/ 18 сентября 2013

FYI - метод AddFormatter устарел в версии 3.0. Вместо этого вы можете использовать ConvertUsing:

Mapper.CreateMap<DateTime, string>()
    .ConvertUsing<DateTimeCustomConverter>();

public class DateTimeCustomConverter : ITypeConverter<DateTime, string>
{
    public string Convert(ResolutionContext context)
    {
        if (context.SourceValue == null)
            return null;
        if (!(context.SourceValue is DateTime))
            return context.SourceValue.ToNullSafeString();
        return ((DateTime)context.SourceValue).ToShortDateString();
    }
}
1 голос
/ 13 мая 2010

Я использую AutoMapper v1.

Там есть абстрактный класс, который выполняет большую часть основной работы под названием ValueFormatter.

Мой код:

public class DateStringFormatter : ValueFormatter<DateTime>
{
    protected override string FormatValueCore(DateTime value)
    {
        return value.ToString("dd MMM yyyy");
    }
}

Тогда в моем классе профиля:

public sealed class ViewModelMapperProfile : Profile
{
    ...

    protected override void Configure()
    {
        ForSourceType<DateTime>().AddFormatter<DateStringFormatter>();

        CreateMap<dto, viewModel>()
            .ForMember(dto => dto.DateSomething, opt => opt.MapFrom(src => src.DateFormatted));

}

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