2016-08-30 2 views
1

В моем приложении ASP.NET MVC мне нужно выполнить сопоставление от одного объекта к другому с помощью какого-то интерфейса для конфигурации отображения во время выполнения, поэтому пользователь может определить отображение «в движении». Существуют ли библиотеки, поддерживающие такую ​​функциональность?automapper с конфигурацией отображения времени выполнения

Описание

Это объекты в моем приложении. Мне нужно каким-то образом разрешить пользователю настраивать сопоставление этих объектов через пользовательский интерфейс во время запуска приложений. Для exmaple какого-то страницы в моем приложении, где пользователь сможет определить отображение в простой форме, как так карты Amout из OrderDTO на заказ Количества, а затем без применения перекомпиляции изменить отображение для 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 
} 
+0

Можете ли вы уточнить примеры? –

+0

Я не думаю, что это возможно. –

ответ

2

Примечание. Исходным причинам я основывал этот ответ на AutoMapper 4.2.1 вместо текущей версии 5.x. Общий подход должен быть аналогичным с новой версией.

В программе можно создавать различные конфигурации отображения и разные карты. Кроме того, вместо лямбда-выражений можно создавать сопоставления элементов по именам участников (string). Тем не менее, некоторые данные статического типа все еще необходимы (насколько мой пример идет).

Смотрите следующий пример профиля, который готовит пользовательское отображение на основе имен свойств:

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. Поскольку различие описывается как имена свойств строки, должно быть возможно позволить пользователю влиять на эту конфигурацию.

+1

@NickJones Я уверен, что вы не имели никакого вреда с редактированием, но это не опечатки моего ответа, но я выбрал свое имя так же, как и я, чтобы соответствовать опечаткам в вопросе. Код не является бесплатным текстом, поэтому орфография должна сначала учитывать функциональность. – grek40

Смежные вопросы