Почему AutoMapper имеет IValueFormatter, когда он имеет по-видимому намного более мощный ValueResolver?

Это похоже IValueFormatter принимает значение типа object и возвращает значение типа string, в то время как a ValueResolver<TSource, TDestination> принимает значение любого типа и возвращает значение любого типа. Так, это более гибко. Существует также вопрос это с a ValueResolver, Вы никогда не должны бросать источник к конкретному типу - Вы определяете его явно в Вашем определении класса.

Учитывая это, почему использование IValueFormatter? Это делает что-нибудь, что не может быть, покончили ValueResolver? Я неправильно понимаю, как это работает?

15
задан Daniel Schilling 9 November 2011 в 23:40
поделиться

3 ответа

__ iter __ должен возвращать итератор, а не список.

Попробуйте это:

    def __iter__(self):
        return iter(self._values)

Вы также могли бы сделать:

    def __iter__(self):
        for val in self._values:
            yield val

Но я не могу на самом деле придумать причину, по которой вам нужно сделать это вместо использования iter ()

-121--4109578-
def __iter__(self):
    return iter(self._values)

Или более общего:

def __iter__(self):
    for x in self._values:
        yield x
-121--4109577-

Таким образом, вы можете сделать что-то вроде "ForSourceType.AddFormatter () в профиле, и теперь blammo! Теперь все ваши десятичные знаки отображаются как деньги. Распознаватели предназначены исключительно для пользовательского сопоставления членов.

13
ответ дан 1 December 2019 в 04:17
поделиться

Хорошо, я думаю, что я понял это:

  • с иваламформформом , вход в метод FormatValue () - это фактическое значение. (Хорошо, технически, это объект VIALLCONTEXT , который позволяет получить значение, используя свойство SourceValue , но вы получаете идею).

  • С Valueresolver , вход в метод Resolvecore () метода является весь источник (не только исходное значение).

Итак, если вы хотите сделать какую-то конверсию между исходным значением и значением назначения, ивалауэрфорформизм будет работать только в том случае, если тип назначения является строкой и Valueresolver будет работать только в том случае, если метод Resolvecore () метод «знает», какое свойство использовать (что не будет так, если ваш Resolver является общем назначением, т. Е. Не применяется к определенной собственности).

Обходной путь

К счастью, всегда есть mapfrom , что обеспечивает гибкость, которая отсутствует как разрешетелей, так и для формшестей.

Интерфейс преобразователя

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

public interface ITwoWayConverter<TInput, TOutput>
{
    TOutput ConvertForward(TInput value);
    TInput ConvertBackward(TOutput value);
}

Пример преобразователя:

public class PhoneNumberToString : ITwoWayConverter<long, string>
{
    public string ConvertForward(long value)
    {
        return string.Format("{0:(###) ###-####}", Convert.ToInt64(value));
    }

    public long ConvertBackward(string value)
    {
        return Convert.ToInt64(Regex.Replace(value, @"\D", string.Empty));
    }
}

Пример использования:

Mapper.CreateMap<User, UserViewModel>()
    .ForMember(dest => dest.PhoneNumber, opt => opt
        .MapFrom(orig => new PhoneNumberToString().ConvertForward(orig.PhoneNumber)));
3
ответ дан 1 December 2019 в 04:17
поделиться

IvalueFormatter - это интерфейс, и может быть прикреплен к вашим существующим классам или используется в сочетании с той когда-либо библиотечной библиотекой, она выглядит как Valueresolver - это класс, который может иметь более широкий спектр использования ... в разных Слова, IvalueFormatter, вероятно, используется для того, чтобы помочь вам использовать ваши классы с библиотекой, из которой она пришла, а значение Resolver предназначен для того, чтобы помочь вам использовать их классы в вашем коде.

0
ответ дан 1 December 2019 в 04:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: