Converti classe in un'altra classe e viceversa

4

Ho una classe di dominio chiamata Campaign.

Class Campaign {
    public long CampaignID { get; set; }
    public string CampaignName { get; set; }
    public DateTime StartTime { get; set; }
    public DateTime EndTime { get; set; }
}

In aggiunta a ciò, sto usando Asp.net MVC e ho definito una classe del modello.

[DataContract]
public class CampaignModel
{
    [DataMember(Name="id")]
    public long Id { get; set; }

    [DataMember(Name = "name")]
    public string CampaignName { get; set; }

    [DataMember(Name = "isDummy")]
    public bool IsDummy { get; set; }
} 

Il mio obiettivo è convertire da una classe all'altra e viceversa.

Sto utilizzando ASP.NET per le chiamate REST dalla mia app Angular 2.

La mia app ha due casi d'uso, uno è quello di creare Campaign, quindi ho bisogno di convertire da CampaignModel in classe Campaign e memorizzare la campagna. Il secondo caso d'uso è caricare la Campagna esistente nell'interfaccia utente, quindi convertire da Campaign a CamapignModel.

  • Se è importante, la conversazione tra i due non è banale e comporta l'uso di strutture dati complesse.

Ho pensato a diverse opzioni:

  1. Crea due metodi in CampaignModel.

    public Campaign Convert();
    public CampaignModel Convert(Campaign);
    
  2. Crea una classe separata ad es. CampaignConverter

  3. Utilizza una libreria nota dedicata che faciliti la conversione tra i due, o pattern di progettazione noto?
  4. altre idee?

Grazie

    
posta MasterOfPuppets 17.01.2017 - 14:45
fonte

1 risposta

4

Se si tratta di un semplice lavoro di cast (non sembra esserlo), utilizzerei un operatore esplicito. Di seguito sono riportati alcuni esempi di documentazione MSDN :

// Must be defined inside a class called Fahrenheit:
public static explicit operator Celsius(Fahrenheit fahr)
{
    return new Celsius((5.0f / 9.0f) * (fahr.degrees - 32));
}

Questo cast è fatto nella classe client , la classe che è la destinazione del cast. La fonte non deve sapere chi lo consumerà. È responsabilità del consumatore fare il casting appropriato.

Tuttavia, questa parte della tua domanda mi ha fatto riflettere:

If that's matter, the conversation between the two isn't trivial and involves using complex data structures.

Se questa trasformazione è complessa, richiede molto tempo, coinvolge IO e tende a lanciare eccezioni, quindi il modo migliore è creare una classe specifica in un livello Business (o nel tuo dominio livello), responsabile di eseguire la trasformazione e gestire correttamente le possibili eccezioni.

Ma tieni presente che un contratto dati non deve essere una parte interna del tuo modello di dominio, perché è al confine. E " Ai confini, le applicazioni non sono orientate agli oggetti ".

    
risposta data 17.01.2017 - 15:18
fonte

Leggi altre domande sui tag