2

なぜこれを行うのですか

Mapper.CreateMap<MyObject, AnotherObject>().
ForMember(x => x.DateAsString, m => m.ResolveUsing<StringToDateTimeFormatter>());

private class StringToDateTimeFormatter : ValueResolver<DateTime, string>
{
    protected override string ResolveCore(DateTimesource)
    {
        return source.ToString("yyyy-MM-dd");
    }

 }

あなたがこれを行うことができるとき

Mapper.CreateMap<MyObject, AnotherObject>().
ForMember(x => x.DateAsString, m => m.MapFrom(x => x.Date.ToString("yyy-MM-dd")));

???

アップデート

より複雑なビジネスロジックを実行する方法の例を次に示します。

Mapper.CreateMap<MyObject, AnotherObject>().
ForMember(x => x.DateAsString, m => m.MapFrom(n => MyMethod(n.DateAsString)));

    private object MyMethod(string dateTime)
    {
        if(!MyDomainObjectIsValid(dateTime))
        {
            throw new MyValidationException();
        }

        // do more stuff
    }

ValueResolverの必要性はまだわかりません...

4

1 に答える 1

4

明らかに、あなたの例では、だけを使用する方が合理的MapFromです。より複雑なケースでは、ValueResolverが必要です。たとえば、検証を行い、それに応じて例外をスローする必要がある場合です。

EDIT ValueResolversは、宛先のタイプと値へのアクセスを提供します。これが小さな例です。

public class FakeResolver : IValueResolver
{
    public ResolutionResult Resolve(ResolutionResult source)
    {
        if (source.Context.DestinationType == typeof(string) && source.Context.DestinationValue == "test")
            throw new Exception();
        return source;
    }
}
于 2012-11-02T23:18:18.093 に答える