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

显然,对于您的示例,使用 just 更合理MapFrom。更复杂的情况需要 ValueResolvers。例如,当您需要进行一些验证并相应地引发异常时。

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 回答