2017-02-21 1 views
0

Ich bin in der Notwendigkeit, das folgende Szenario zu mappen.Wie mappe ich dies mit Automapper

Von DAL bekomme ich CustomerJson Wert wie folgt.

Customer.CustomerJson = { 
    "name": "Ram", 
    "city" : "India" 

}

Ich brauche diese Zeichenfolge Deserialize. Also habe ich beim Mappen die folgenden Sachen ausprobiert.

var config = new MapperConfiguration(cfg => 
        { 
         cfg.CreateMap<Customer, CustomerTO>() 
         .ForMember(dest => dest.CustName, opt => opt.MapFrom(src => JsonConvert.DeserializeObject(src.CustName))); 
        }); 

Aber das gibt mir Laufzeitfehler.

Nicht behandelte Ausnahme: AutoMapper.AutoMapperMappingException: Fehlerzuordnungstypen.

So behielt ich es einfach.

var config = new MapperConfiguration(cfg => 
        { 
         cfg.CreateMap<Customer, CustomerTO>() 
         .ForMember(dest => dest.CustName, opt => opt.MapFrom(src => (src.CustName)); 
        }); 

Und ich habe versucht, es zu deserialisieren, während es verbraucht. Aber das gibt Kompilierzeit Fehler.

var custJson = JsonConvert.DeserializeObject(customerTO.CustomerJson); 

Fehler 2 Die beste überladene Methode Match für 'Newtonsoft.Json.JsonConvert.DeserializeObject (string)' hat einige ungültige Argumente

Ich weiß customerTO.CustomerJson nicht String ist aber wie Soll ich die erforderliche Zuordnung vornehmen?

Danke.

+0

'customerTO.CustomerJson' ist ein Objekt, keine Zeichenfolge. Lesen Sie die Ausnahmebedingungsnachricht ... –

+0

@CallumLinington, Ja. Ich weiß, wie ich dann mappe, das ist meine Frage –

+0

Verbringen Sie mehr Zeit, die Dokumentation zu lesen und zu verstehen –

Antwort

1

auf previous question Basierend und die Informationen gegeben über Sie verwirrend zu sein scheinen, was Sie versuchen, hier zu tun.

Also werde ich die Daten von beiden zusammenfassen, um die Probleme zu lösen. Klassen

Entity:

public class Customer 
{ 
    public int CustomerId {get; set; } 
    public string CustomerName { get; set; } 
    public string CustomerJson { get; set; } 
} 

public class CustomerTO 
{ 
    public int CustId { get; set; } 
    public object CustData { get; set; } 
    public object CustomerJson { get; set; } 
} 

AppMapper Klasse:

public static class AppMapper 
{ 
    public static MapperConfiguration Mapping() 
    { 
     return new MapperConfiguration(cfg => 
      { 
       cfg.CreateMap<Customer, CustomerTO>() 
       .ForMember(dest => dest.CustId, opt => opt.MapFrom(src => src.CustomerId)) 
       .ForMember(dest => dest.CustData, opt => opt.MapFrom(src => src.CustName)) 
       .ForMember(dest => dest.CustomerJson, opt => opt.MapFrom(src => JsonConvert.DeserializeObject(src.CustomerJson)); 
      }); 
    } 
} 

Main:

public class Program 
{ 
    static void Main(string[] args) 
    { 
     var config = AppMapper.Mapping(); 
     var mapper = config.CreateMapper(); 

     // From Previous question get list of Customer objects 
     var customers = AddCustomers(); 
     var mappedCustomers = mapper.Map<IEnumerable<CustomerTO>>(customers); 
    } 
} 

Ein paar Dinge hinweisen, Ich bin nicht sicher, was der Zweck CustData in CustomerTO ist. Es scheint zu duplizieren CustomerJson und wenn ja, entfernen Sie es und die zugehörige Zuordnung.

Auch Sie erwähnen nie Zuordnung von DTO zurück zur Einheit, sondern auch für die JsonObject müssen Sie nur um es konfigurieren, dass die serialisierte Zeichenfolge an den entsprechenden Property abzubilden.

0

So habe ich meine Anforderung adressiert.

Db Entity

public class Customer 
{ 
    public string CustomerData { get; set; } 
    // & other properties 
} 

Mein DTO

public class CustomerTO 
{ 
    public object CustomerData { get; set;} 
    // & other properties 
} 

habe ich ein Dienstprogramm wie Klasse mit dem Namen AppMapper. So sieht mein AppMapper.cs aus.

public class AppMapper 
{ 
    private IMapper _mapper; 
    public AppMapper() 
    { 
     var config = new MapperConfiguration(cfg => 
     { 
      cfg.CreateMap<Customer, CustomerTO>(); 
      //& other such mapping 
     }); 

     _mapper = config.CreateMapper(); 
    } 

public CustomerTO Map(Customer customerEntity) 
    { 
     var customerTo= _mapper.Map<Customer,CustomerTO>(customerEntity); 
     return customerTo; 
    } 

Jetzt, als ich das Mapping brauchte.

class DAL 
{ 
    public CustomerTO GetCustomers() 
    { 
     var customers= //LINQ To get customers 

     var customerTO = Mapping(customer); 

     return customerTO; 

    } 
    //However, this mapping glue in some internal class to retain SOLID principles 
    private CustomerTO Mapping(Customer custEntity) 
    { 
     var custTO = _appMapper.Map(custEntity); 
     var str = JsonConvert.Serialize(custTO.CustomerData); 
     custTO.CustomerData = JsonConvert.Deserialize(str); 
     return custTO; 
    } 
} 

Das ist es.

@Barry O'Kane - Herzlichen Dank für Ihre Eingaben.

Punkte anzumerken: -

  1. ich seit der Eigenschaftsname gleiche ist nicht manuell eine der properites Karte müssen. Außerdem gebe ich String zum Objekt. Also keine Probleme.
  2. Wenn Sie .Map() für eine Eigenschaft verwenden, dann habe ich festgestellt, dass ich jede Eigenschaft zuordnen muss, sonst gibt es den Standardwert des Datentyps (zB für int gibt es 0).

Ja. einverstanden, dass es andere Methode in Automapper geben könnte, die mir erlaubt, dass für eine bestimmte Eigenschaft dieses manuelle Zuordnen & für den restlichen Gebrauch Automapping-Mechanismus zu spezifizieren. Aber ich bin mir da nicht sicher.

Bitte zögern Sie nicht, diese und in jeder Hinsicht zu verbessern.

Hoffe, das hilft :)