c# - 具有运行时映射配置的自动映射器

标签 c# asp.net-mvc automapper

在我的 ASP.NET MVC 应用程序中,我需要使用某种 UI 来实现从一个对象到另一个对象的映射,以便在运行时进行映射配置,以便用户可以“随时随地”定义映射。是否有支持此类功能的库?

描述

这是我应用程序中的对象。我需要以某种方式允许用户在应用程序运行期间通过 UI 配置此对象的映射。例如我的应用程序中的某种页面,用户将能够以简单的方式定义映射,例如将 OrderDTO 的 Amout 映射到订单数量,稍后无需应用程序重新编译即可将此映射更改为 exmaple 的 ExactAmmount

//Object in DAL
public class Order 
{
    public int Id {get; set;}
    public string Name {get; set;}
    public decimal Qty {get; set;}
    //Lots of other fields 
}

//Object from XSD generation (for example)
public class OrderDTO 
{
    public int Id {get; set;}
    public string Description {get; set;}
    public decimal Ammout {get; set;}
    public decimal VAT {get; set;}
    public decimal ExactAmmount {get; set;}
    //Lots of other fields
}

最佳答案

注意:由于遗留原因,我将此答案基于 AutoMapper 4.2.1 而不是当前的 5.x 版本。整体方法应该与新版本类似。

可以在程序中创建不同的映射配置和不同的映射器。此外,可以通过成员名称(string)而不是 lambda 表达式来创建成员映射。但是,仍然需要一些静态类型信息(就我的示例而言)。

请参阅以下配置文件示例,它根据属性名称准备自定义映射:

class MemberProfile : Profile
{
    private string from;
    private string to;

    public MemberProfile(string from, string to)
    {
        this.from = from;
        this.to = to;
    }

    protected override void Configure()
    {
        this.CreateMap<Order, OrderDTO>()
            .ForMember(to, c => c.MapFrom<decimal>(from));
    }
}

这可以扩展以支持不同的源属性类型和一组自定义映射,而不是单个映射。

使用示例:

var order = new Order() { Id = 1, Name = "Test", Qty = 0.5m };

var conf1 = new MapperConfiguration(c => c.AddProfile(new MemberProfile("Qty", "Ammout")));
var conf2 = new MapperConfiguration(c => c.AddProfile(new MemberProfile("Qty", "ExactAmmount")));
var res1 = conf1.CreateMapper().Map<OrderDTO>(order);
var res2 = conf2.CreateMapper().Map<OrderDTO>(order);

对于res1Qty被映射到Ammout,对于res2Qty > 映射到 ExactAmmount。由于差异被描述为字符串属性名称,因此应该可以让用户影响此配置。

关于c# - 具有运行时映射配置的自动映射器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39219585/

相关文章:

c# - 如何在新创建的数据库列上将访问列值设置为 0(默认值)? C#

c# - 具有不同属性类型的 AutoMapper 对象

c# - 具有相同类型的嵌套 Dto 的 Dto 失败

c# - 将 ASP.net Identity 2.0 连接到现有数据库

c# - 比较两个对象的不同属性值

c# - 将旧的 VB6 QBColor 函数翻译成 C#

c# - 从 datetimepicker 计算两个日期之间的差异

c# - bool Prop 匹配

c# - 性能调整 Entity Framework 查询

c# - 使用自定义构造函数进行代码优先迁移