在我的ASP.NET MVC应用程序中,我需要实现从一个对象到另一个对象的映射,并使用某种用于在运行时映射配置的UI,因此用户可以在运行中定义映射"。是否有任何支持此类功能的库?
描述
这是我的应用程序中的对象。我需要以某种方式允许用户在应用程序运行期间通过UI配置此对象的映射。对于我的应用程序中的某种页面,用户将能够以简单的方式定义映射,如此将OrderDTO的Amout映射到Order Qty 以及稍后在没有应用程序重新编译的情况下更改此映射为Exactple for 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
}
答案 0 :(得分:3)
注意:由于遗留原因,我将此答案基于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);
对于res1
,Qty
映射到Ammout
,res2
,Qty
映射到ExactAmmount
。由于差异被描述为字符串属性名称,因此应该可以让用户影响此配置。