web-dev-qa-db-fra.com

Convertir la classe en une autre classe et vice versa

J'ai une campagne de classe de domaine nommée.

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

En plus de cela, j'utilise ASP.NET MVC et j'ai défini une classe de modèle.

[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; }
} 

Mon objectif est de convertir d'une classe à une autre et inversement.

J'utilise l'ASP.NET pour REST appels de mon Angular APP.

Mon application dispose de deux cas d'utilisation, l'une est de créer une campagne, je dois donc convertir de CampagneModel en classe de campagne et stocker la campagne. Le deuxième cas d'utilisation consiste à charger la campagne existante dans l'interface utilisateur de l'intervalle de l'interface utilisateur. Par conséquent, convertissez de la campagne à CamapignModel.

  • Si c'est une matière, la conversation entre les deux n'est pas triviale et implique d'utiliser des structures de données complexes.

J'ai pensé à plusieurs options:

  1. Créez deux méthodes dans la campagneModel.

    public Campaign Convert();
    public CampaignModel Convert(Campaign);
    
  2. Créer une classe distincte par exemple Connecteurs de Campagne

  3. Utilisez une bibliothèque connue dédiée qui facilite la conversion entre les deux ou les modèles de conception connus?
  4. toute autre idée?

Merci

3
MasterOfPuppets

S'il s'agit d'un simple poste de distribution (cela ne semble pas être), j'utiliserais un opérateur explicite. Il existe de bons exemples dans Documentation MSDN À ce sujet:

// 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));
}

Cette distribution est effectuée dans le client , la classe qui est la destination de la distribution. La source n'a pas à savoir qui va le consommer. Il incombe au consommateur de faire le casting approprié.

Cependant, cette partie de votre question m'a fait penser:

Si c'est une matière, la conversation entre les deux n'est pas triviale et implique d'utiliser des structures de données complexes.

Si cette transformation est complexe, la consommation de temps, implique IO et enclin à lancer des exceptions, alors le meilleur moyen est de créer une classe spécifique dans une entreprise Couche (ou dans votre Domaine Couche), responsable de la transformation et de la manipuler correctement les exceptions possibles.

Mais soyez juste conscient qu'un contrat de données ne doit pas être une partie intérieure du modèle de domaine, car elle est à la limite. Et " sur les limites, les applications ne sont pas orientées objet ".

4
Machado