2011-03-17 3 views
3

Je suis confronté à un problème de conception de classe. J'utilise le sérialiseur de contrat de données.Deux ensembles d'attributs de sérialisation sur la même classe

Ainsi, dans l'assemblée qui est partagée entre toutes mes applications, j'ai quelque chose comme ceci:

// Assembly DataContracts.dll: .NET 3.0, used by every subsystems 
[DataContract] 
public class User 
{ 
    /// <summary>Nickname.</summary> 
    [DataMember] 
    public string displayName; 
} 

Il y a beaucoup d'autres champs: Je l'ai laissé que DisplayName essayer de compacter mes listes de codes.

Cependant, l'une des applications est un serveur, qui a besoin d'une autre sérialiseur à appliquer à la même classe, de la manière suivante:

// Assembly ServerDatabase.dll, .NET 4.0, used only by server. 
[EseTable] 
public class User 
{ 
    /// <summary>Nickname.</summary> 
    [EseText(bUnicode=true, maxChars=71)] 
    public string displayName; 
} 

ServerDatabase.dll est lié à 4. .NET En outre, Les attributs [Ese *] sont définis dans une DLL qui peut uniquement être chargée par le composant serveur pour des raisons de sécurité hors de mon contrôle, donc je ne peux pas avoir une seule classe avec les deux ensembles d'attributs partagés par chaque sous-système.

Actuellement, j'ai écrit quelque chose comme ceci:

// DataContracts.dll 
[DataContract] 
public class User 
{ 
    [DataMember] 
    public string displayName; 
} 

// ServerDatabase.dll 
[EseTable] 
public class UserRecord: User 
{ 
    [EseText(bUnicode=true, maxChars=71)] 
    new public string displayName { get { return base.displayName; } set { base.displayName=value; } } 

    // Note I need to implement an upcasting copy constructor, to convert from User to UserRecord :-(
    public UserRecord(User that) 
    { 
     base.displayName=that.displayName; 
    } 
} 

Je ne aime pas vraiment ma solution: ressemble à un hack, et sujette aux erreurs. Des idées, corrections ou corrections différentes?

Merci d'avance!

+0

Point mineur, mais les champs publics: pas une bonne idée. –

Répondre

0

Je ne pense pas que cette solution fonctionnera bien, car ni les sous-types ni les types de base ne doivent être gérés par le sérialiseur "other" (si vous voyez ce que je veux dire). Personnellement, je créerais une couche DTO pour le niveau "inhabituel", et mapper entre eux. Donc, à peu près comme l'exemple dans la question, peut-être en utilisant AutoMapper. L'autre option consiste à voir si l'autre sérialiseur prend en charge les métadonnées provenant de sources autres que des attributs. Certains le font, d'autres non.

Si automapper cause des problèmes que vous pouvez simplement annoter votre serveur DTO avec le même DCS attributs et utiliser DCS pour traduire le modèle, à savoir

[EseTable, DataContract] 
public class User 
{ 
    /// <summary>Nickname.</summary> 
    [EseText(bUnicode=true, maxChars=71), DataMember] 
    public string displayName; 
} 

Tant que les noms correspondent, DCS doit être assez heureux avec ce. c'est-à-dire utiliser DCS pour sérialiser à partir d'un modèle et désérialiser comme modèle autre modèle. J'utilise des astuces similaires dans quelques endroits (bien que j'ai tendance à utiliser mon propre sérialiseur pour cela, pas DCS - plus rapide; p)

Questions connexes