【问题标题】:Automapper Dynamic Resolver'sAutomapper 动态解析器​​的
【发布时间】:2018-08-07 15:46:55
【问题描述】:

我正在尝试在 automapper 之上创建一个抽象层,使用户能够为他们映射的每个属性动态添加自定义规则。

给定模型

public class Entity
{
    public int Index { get; set; }
}

public class DTO
{
    public int Count { get; set; }
}

我们可以像这样配置 Automapper 来映射实体:

//sorry this is pseudo coded
cfg.CreateMap<Entity, DTO>()
    .ForMember(dest => dest.Index, 
        opt => opt.ResolveUsing<IndexResolver>());


public class IndexResolver: ValueResolver<DTO, int>, 
{
    protected override string ResolveCore(DTO source)
    {
        return source.Count - 1;
    }
}

这是可行的,因为我们将规则映射到值解析器,但是如果我想在运行时创建规则,这是可能的。我希望能够像这样配置:

cfg.CreateMap<Entity, DTO>()
    .ForMember(dest => dest.Index, 
        opt => opt.Resolver(d => d.Count - 1);

有没有办法可以添加带有表达式的解析器,这样我就不需要从 ValueResolver 继承?

【问题讨论】:

    标签: c# expression automapper castle-dynamicproxy


    【解决方案1】:

    我的第一个想法是创建一个通用的自定义解析器,它在其构造函数中接受一个表达式。然后你应该能够做到:

    .ResolveUsing(new LambdaResolver(d => d.Count - 1))
    

    【讨论】:

    • 您将如何处理 Lambda Resolver 的 ValueResolver?你的意思是这样吗LambdaResolver&lt;Entity, DTO, int&gt;
    • 仔细设置一个选项管理器,它接收通用 lambda 并将它们存储在字典中?然后类型映射选项中的 foreach 表达式使用带有 LambdaResolver 的反射应用它们,并将映射器作为单例存储在我的 DI 中,这样我就不用每次都使用反射创建一个新的映射器来浪费时间?
    • 啊也许因为映射选项是类型我不需要使用反射,因为我应该可以从地图访问它。有趣我会调查
    猜你喜欢
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 2011-08-05
    • 2019-11-21
    相关资源
    最近更新 更多