2011-01-08 3 views
2

Ich verwende DataAnnotations zur Überprüfung einer benutzerdefinierten Klasse (LINQ to SQL wird automatisch generiert), wobei das MetadataType-Tag über der Klasse verwendet wird. Ich liebe DataAnnotations und es funktioniert gut in einfachen, gängigen Szenarien. Z.B.ASP.Net MVC2 Validieren Sie zwei ViewModels der gleichen Klasse mithilfe von DataAnnotations.

Aber was, wenn Sie zwei verschiedene Sätze von Validierungsregeln in verschiedenen Szenarien auf die Klasse angewendet haben müssen ???

Meine Situation: Einige Felder sind obligatorisch auf der www öffentlichen Seite, aber nicht obligatorisch auf der internen Admin-Site. Aber beide Seiten haben eine Ansicht, die "Neues erstellen" desselben Objekts/derselben Klasse erzeugt.

Dies ist, wo es DataAnnotations HELL Oberflächen .. wird

I mit unterschiedlichen Validierung für jeden von ihnen, zwei Klassen, die von Person erben angewendet unter Verwendung von zwei verschiedenen Viewmodels versucht haben, mit unterschiedlichen Validierung für jeden von ihnen angewandt. Aber alle Wege scheinen mit DRY-Prinzipien zu konfligieren, und Sie landen irgendwo entlang der Linie, die alle Eigenschaften für die zugrundeliegende Klassenstruktur vollständig neu spezifiziert. Sie müssen dies nicht tun, wenn Sie nur eine Validierungsregel festgelegt haben. So wird es schnell zur Hölle und nicht praktisch für komplexe Objekte.

Ist dies mit DataAnnotations möglich und was ist die beste DRY-Architektur?

Antwort

1

Nicht sicher, was Sie meinen, virtuell duplizieren und jede Eigenschaft manuell in der ursprünglichen zugrunde liegenden Klasse manuell festlegen. Ich habe die Idee von Buddy-Klassen noch nie gemocht und würde persönlich verschiedene Ansichtsmodelle für Admin- und Public-Site empfehlen (mit entsprechenden Validierungseinstellungen) und dann zwischen den Modellen unter Verwendung von AutoMapper mappen.

UPDATE:

regading AutoMapper, ist die grundlegende Verwendung etwas wie folgt aus:

  • Zuerst müssen Sie Ihre Zuordnungen definieren. Dadurch kann der Auto-Mapper im Voraus herausfinden, wie Objekte abgebildet werden. Sie müssen dies nur einmal in der Anwendung durchführen. In Application.Start() in Global.asax ist dies der geeignete Ort für eine ASP.NET-Anwendung. Für jedes Paar von Klassen, die Sie zwischen zuordnen möchten, rufen: Mapper.CreateMap<SourceType, DestinationType>();

  • Dann in Ihrem Anwendungscode der Karte zu tun, die Sie gerade verwenden:

var destinationObject = Mapper.Map<SourceType, DestinationType>(sourceOjbect);

+0

ich zu dem gleichen Ergebnis gekommen dass AutoMapper beteiligt sein muss, aber ich hatte gehofft, dass ich falsch lag. Das Problem tritt auf, wenn man eine "Edit" -Ansicht lädt. Sie lesen den ID-Parameter in und rufen dann das Objekt ab, das bearbeitet werden muss, bevor es an die Ansicht übergeben wird. An diesem Punkt müssen Sie die Werte im ViewModel basierend auf dem Objekt, das Sie abgerufen haben, irgendwie festlegen. Hier führen alle Wege zur Hölle, sonst AutoMapper. Ich kann diese gesamte Architektur mit zwei verschiedenen Validierungsregelsätzen perfekt arbeiten lassen, aber die Werte des abgerufenen Objekts für die Bearbeitung setzen, wo es bläst. – Aaron

+0

Aber warum willst du keinen Autoadapter verwenden? - Es ist perfekt für genau dieses Szenario, einfach zu bedienen und performant. Du kannst fast vergessen, dass es da ist. – UpTheCreek

+0

Ich werde wahrscheinlich auf die Verwendung zurückgreifen, und ich weiß Ihren sehr gültigen Punkt zu schätzen, aber ich bin sehr streng darauf, die Anzahl der Fremd-/Zusatzkomponenten zu minimieren, die ich in meine Systeme bringe. Aus Erfahrung, 3 Jahre auf der Strecke, plötzlich ASP.Net MVC10 ist freigegeben und Ihre gesamte Lösung wird nicht erstellt, weil Sie eine wirklich alte Version von AutoMapper und was auch immer andere Add-on-DLLs ausführen. Meine erste Präferenz ist immer wirklich hart zu versuchen, native Tools zuerst vor dem Umsortieren zu verwenden zu Add-ons. In der Regel, je mehr Add-ons, desto weniger Zuverlässigkeit und höhere zukünftige Wartung. – Aaron