运行时映射配置的自动映射程序(Automapper)

4
在我的ASP.NET MVC应用程序中,我需要实现从一个对象到另一个对象的映射,并提供一种UI以在运行时进行映射配置,以便用户可以“即兴”定义映射。是否有支持此功能的库?
描述:
这是我应用程序中的对象。我需要让用户能够通过UI在应用程序运行期间配置这些对象的映射。例如,在我的应用程序中创建某种页面,用户可以简单地定义映射,例如将OrderDTO的Amount映射到Order Qty,稍后可以在不重新编译应用程序的情况下更改此映射,例如将其更改为ExactAmount。
//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
}

你能给出更具体的例子吗? - Amit Kumar Ghosh
我认为那是不可能的。 - Amit Kumar Ghosh
1个回答

4
注意:由于遗留原因,我基于 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。由于差异是通过字符串属性名称描述的,因此应该可以让用户影响此配置。


2
@NickJones 我相信你的编辑没有恶意,但那些不是我的答案中的错别字,而是我选择这样命名是为了与问题中的错别字匹配。代码不是自由文本,所以拼写必须首先尊重功能。 - grek40

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接