15

It looks like an IValueFormatter takes a value of type object and returns a value of type string, while a ValueResolver<TSource, TDestination> takes a value of any type and returns a value of any type. So, it's more flexible. There is also the matter that, with a ValueResolver, you never need to cast the source to a particular type--you define it explicitly in your class definition.

Given this, why use IValueFormatter? Does it do anything that can't be done with ValueResolver? Am I misunderstanding how it works?

4

3 に答える 3

13

大きな違いは、フォーマッターをメンバー、プロファイル、タイプ、およびグローバルレベルで適用できることです。したがって、プロファイルで「ForSourceType.AddFormatter()」のようなことを行うことができ、今ではblammo!すべての小数がお金として表示されるようになりました。リゾルバーは厳密にカスタムメンバーマッピング用です。

于 2010-02-01T22:41:53.990 に答える
3

さて、私はこれを理解したと思います:

  • を使用すると、メソッドIValueFormatterへの入力FormatValue()は実際の値になります。(技術的にはResolutionContext、プロパティを使用して値を取得できるオブジェクトSourceValueですが、アイデアは得られます)。

  • を使用すると、メソッドValueResolverへの入力ResolveCore()はソース全体(ソース値だけでなく)になります。

したがって、ソース値とデスティネーション値の間で何らかの変換を行うIValueFormatter場合、はデスティネーションタイプがであるstring場合ValueResolverにのみ機能し、ResolveCore()メソッドが使用するプロパティを「認識」している場合にのみ機能します(リゾルバが汎用である場合、つまり特定のプロパティに適用されない場合に当てはまります)。

回避策

幸いなことに、常に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)));
于 2010-02-01T05:10:17.443 に答える
0

IValueFormatterはインターフェイスであり、既存のクラスに追加したり、ライブラリから作成したライブラリと組み合わせて使用​​したりできます。ValueResolverは、より幅広い用途を持つ可能性のあるクラスのようです...言い換えると、IValueFormatterおそらく、元のライブラリでクラスを使用するのに役立つように使用されますが、値リゾルバーは、コードでクラスを使用するのに役立つように設計されています。

于 2010-02-01T03:13:43.807 に答える