2012-04-03 11 views
-1

Ähnliche Fragen wurden gestellt, können aber keine Lösung finden, die gut funktioniert. Was ich habe, ist ein ziemlich großes Objekt (Viper-Objekt), das mehrere Unterobjekte und Listen hat. Ich werde mehrmals pro Sekunde eine neue Instanz eines Viper-Objekts erhalten und diese Daten in ein "Master" Viper-Objekt zusammenführen. Wenn die Eigenschaft null ist, überspringen Sie sie, wenn sie nicht ersetzt wird. Einige Eigenschaften, die Listen sind, werden nur durch die neue Eigenschaft ersetzt, einige Listeneigenschaften fügen die neue Liste einfach an die bestehende an.Die beste Methode, um ein Objekt mit einem anderen Objekt desselben Typs in .Net zu aktualisieren?

Punkt ist, gibt es Eigenschaften, die einige benutzerdefinierte Logik benötigen, um zu bestimmen, wie die Zusammenführung durchgeführt wird. Die Frage ist, ob ich etwas wie AutoMapper/Value Injector verwenden oder einfach einen benutzerdefinierten Merge-Befehl in das Datenmodell schreiben soll, das ein anderes Viper-Objekt aufnimmt. Dies muss so effizient wie möglich sein, da es viel genannt wird. Hier

ist das Datenmodell:

public class Viper 
{ 
    #region INotifyPropertyChanged Members 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged(string property) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(property)); 
     } 
    } 
    #endregion 

    [DataMember(IsRequired = false, EmitDefaultValue = false)] 
    public int ViperId { get; set; } 

    [DataMember] 
    public int CaseId { get; set; } 

    [DataMember] 
    public int RecordCount { get; set; } 

    [DataMember(IsRequired = false, EmitDefaultValue = false)] 
    public string SerialNumber { get; set; } 

    [DataMember(IsRequired = false, EmitDefaultValue = false)] 
    public string UserName { get; set; } 

    [DataMember(IsRequired = false, EmitDefaultValue = false)] 
    public string GroupName { get; set; } 

    [DataMember] 
    public Byte Status { get; set; } 
    [DataMember] 
    public int CaseStage { get; set; } 

    [DataMember(IsRequired = false,EmitDefaultValue = false)] 
    public CaseDetail CaseDetail { get; set; } 

    private ViperMetaData _metaData; 
    [DataMember(IsRequired = false, EmitDefaultValue = false)] 
    public ViperMetaData MetaData { 
     get { return _metaData; } 
     set 
     { 
      _metaData = value; 
      OnPropertyChanged("MetaData"); 
     } 
    } 

    [DataMember(IsRequired = false, EmitDefaultValue = false)] 
    public List<CasePatientData> PatientDetailsTable1 { get; set; } 
    [DataMember(IsRequired = false, EmitDefaultValue = false)] 
    public List<CasePatientData> PatientDetailsTable2 { get; set; } 
    [DataMember(IsRequired = false, EmitDefaultValue = false)] 
    public List<CasePatientData> PatientDetailsTable3 { get; set; } 
    [DataMember(IsRequired = false, EmitDefaultValue = false)] 
    public List<CasePatientData> PatientDetailsTable4 { get; set; } 

    [DataMember(IsRequired = false, EmitDefaultValue = false)] 
    public List<CaseChannel> CaseChannelDataList { get; set; } // list of all channels available in a specific case/viper 

    [DataMember(IsRequired = false, EmitDefaultValue = false)] 
    public List<EventsData> EventsDataList { get; set; } 


    [DataMember(IsRequired = false, EmitDefaultValue = false)] 
    public List<ChannelData> ChannelDataList { get; set; } 

    [DataMember(IsRequired = false, EmitDefaultValue = false)] 
    public CasePatientDetails CasePatientDetails { get; set; } 

    [DataMember(IsRequired = false, EmitDefaultValue = false)] 
    public List<CaseFluids> CaseFluidsList { get; set; } 

    [DataMember(IsRequired = false, EmitDefaultValue = false)] 
    public List<PatientTable> PatientTableNames { get; set; } 

    [DataMember] 
    public int? TimeOffset { get; set; } 

    [DataMember(IsRequired = false,EmitDefaultValue = false)] 
    public string Html { get; set; } 

    [DataMember(IsRequired = false, EmitDefaultValue = false)] 
    public List<CaseDocument> CaseDocuments { get; set; } 
    [DataMember(IsRequired = false, EmitDefaultValue = false)] 
    public Department Department { get; set; } 
    [DataMember(IsRequired = false, EmitDefaultValue = false)] 
    public List<Gauge> Gauges { get; set; } 
    [DataMember(IsRequired = false, EmitDefaultValue = false)] 
    public List<Region> Regions { get; set; } 
    [DataMember(IsRequired = false, EmitDefaultValue = false)] 
    public List<BloodGasData> BloodGasDataList { get; set; } 
    [DataMember(IsRequired = false, EmitDefaultValue = false)] 
    public List<CardioplegiaData> CardioplegiaDataList { get; set; } 
    [DataMember(IsRequired = false, EmitDefaultValue = false)] 
    public List<ComplianceDataUnit> ComplianceDataList { get; set; } 
} 

Antwort

0

I Auto Mapper oder Wert Injector verwenden würden, wie Sie bereits erwähnt. Vor allem, wenn Ihre Objektnamen über Objekte hinweg ähnlich sind, brauchen Sie kaum Code zu schreiben. Für die benutzerdefinierten Zuordnungen ist es sehr einfach, benutzerdefinierte Funktionen zu schreiben, die an die Zuordnungsmethode übergeben werden. Sehr hilfreich. Schnell Pseudo-Code, was das aussehen würde:

AutoMapper.Mapper.CreateMap<Viper, ViperDto>() 
    .ForMember(dest => dest.Property, opt => opt.NullSubstitute("N/A")); 
var merged = AutoMapper.Mapper.Map(viper, viperDTO); 
+0

Mein erster Test mit AutoMapper (dies noch nie zuvor so sehr grün verwendet), die NULL-Werte über als auch kopiert, so scheint es, will ich einen benutzerdefinierten Handler für jede Eigenschaft haben müssen auch wenn ich sagen muss nicht kopieren wenn null. Wenn das der Fall ist, scheint es nicht weniger Code zu geben, als wenn ich eine benutzerdefinierte Funktion schreiben würde. Klingt das richtig oder habe ich etwas im AutoMapper verpasst? Außerdem füge ich 2 Viper-Objekte zusammen, so dass alle Eigenschaften identisch sind, außer dass einige im "incoming" -Objekt null sind. – mdutra

+0

Automapper enthält eine NullSubstitutionsmethode. Es ist sauber und prägnant. Siehe diese Seite für ein Beispiel: http://taswar.zeytinsoft.com/2011/03/07/automapper-mapping-objects-part-1-of-7-nullsubstitution/ –

+0

Ich muss etwas mit AutoMapper vermissen. Wenn ich für jede Eigenschaft im Objekt einen NullSubstitution-Eintrag hinzufügen muss, warum ist das einfacher als das Erstellen einer MergeWith-Funktion im Datenmodell selbst? Da ich das Objekt mit Datenbindung verwende, kann ich es nicht einfach ersetzen, ich muss das Original wirklich modifizieren. Ist AutoMapper immer noch möglich und einfacher als benutzerdefinierte MergeWith-Funktionen im Viper-Objekt und allen Unterobjekten? – mdutra

Verwandte Themen