2010-12-09 62 views
1

J'ai le scénario suivant:Comment utiliser automapper pour mapper de manière conditionnelle les clés/valeurs à un DTO?

En raison d'une base de données héritée malheureuse, j'ai quelques classes mappées à NHibernate que je veux aplatir dans un DTO. Il ressemble à ceci:

Voici ce que je veux en fin de compte:

public class ProteinSampleDto 
    { 
     public virtual SampleType SampleType { get; set; } 
     public virtual Project Project { get; set; } 
     public virtual long Variant { get; set; } 
     public virtual DateTime CreationDate { get; set; } 
     public virtual User User { get; set; } 

     public virtual string PrepNumber { get; set; } 
     public virtual string Host { get; set; } 
     public virtual string NTermTag { get; set; } 
     public virtual string CTermTag { get; set; } 
     public virtual string Buffer { get; set; } 
     public virtual double ConcentrationMgPerMl { get; set; } 
     public virtual double StorageTemperatureCelsius { get; set; } 
     public virtual string PurificationProtocol { get; set; } 
     public virtual string Comments { get; set; } 
     public virtual string ProteinSequence { get; set; } 
    } 

Voici ce que j'ai la cartographie de base de données après:

public class ProteinSample : PersistentObject 
    { 

     public virtual SampleType SampleType { get; set; } 
     public virtual Project Project { get; set; } 
     public virtual long Variant { get; set; } 
     public virtual DateTime CreationDate { get; set; } 
     public virtual User User { get; set; } 
     public virtual IList<SampleMetadata> Metadata { get; set; } 

    } 

public class SampleMetadata : PersistentObject 
    { 
     public virtual ProteinSample ProteinSample { get; set; } 
     public virtual MetadataType MetadataType { get; set; } 
     public virtual string Value { get; set; } 
     public virtual string LargeValue { get; set; } 
    } 

public class MetadataType : PersistentObject 
    { 
     public virtual string Name { get; set; } 
    } 

Si vous regardez de près, le type SampleMetadata a MetadataType et deux valeurs (Large/Regular). Un MetadataType a un nom, qui est essentiellement une question posée à l'utilisateur à propos d'un échantillon (quel était le numéro de préparation, quel était l'acide aminé N-Term, etc ...)

Je veux regarder conditionnellement le nom du MetadataType, de la façon suivante:

If Name contains: "Prep Number" 
     populate the "PrepNumber" property on ProteinSampleDTO with SampleMetadata.Value 
else if Name contains: "N-Term AA" 
     populate the "NTermTag" property on ProteinSampleDTO with SampleMetadata.LargeValue 
//etc 

Vous avez l'idée. Je veux faire correspondre ce qui se trouve dans MetdataType.Name au nom de la propriété DTO et utiliser la valeur de Value ou Large Value dans la classe SampleMetadata.

Je peux changer les noms des propriétés pour les faire correspondre plus étroitement à la chaîne de Nom si avoir une convention aide à rendre cela plus facile.

Il semble qu'il devrait y avoir une façon pratique de le faire sans avoir à créer manuellement une grande déclaration de changement de monstre (Il y a environ 50 questions différentes).

Est-ce que automapper peut gérer cela?

Répondre