2011-01-07 6 views
0

Ich mache eine MVC2 App, um Abrechnungsschemata zu verwalten. Diese Abrechnungsschemata können verschiedener Art sein, z. täglich, wöchentlich, monatlich usw. und alle Arten haben ihre spezifischen Eigenschaften. Meine Klassenstruktur sieht wie folgt aus:ASP.NET MVC2: ViewModel für eine polymorphe Klasse

public abstract class BillingScheme { /* basic billing scheme properties */ } 
public class BillingSchemeMonthly : BillingScheme 
{ 
    public string SpecificMonths; 
} 
//etc. for other scheme types 

ich rufen Sie eine Abrechnungsschema durch die Basisklasse die Abrechnungsschema-ID, und es gibt mir ein Objekt des richtigen Typs.

Die Eigenschaft SpecificMonths wird einem Datenbank-Varcharfeld zugeordnet, das eine Trennzeichenfolge von Monatszahlen enthält. Ich möchte dies in ein Array aufteilen, damit ich eine Liste von Kontrollkästchen erstellen kann, und ich würde dies am besten mit einer Fassadeneigenschaft in einem Ansichtsmodell tun. Ich könnte es direkt in der Ansicht tun, aber das scheint gegen das MVC-Muster zu gehen.

Das Problem ist, ich kann dieses Viewmodel nur für ein BillingSchemeMonthly erstellen, und ich kann ein BillingSchemeMonthly nicht zu einem BillingSchemeMonthlyViewModel. Ich möchte lieber keine Klon-Methode im View-Modell implementieren, da das gesamte Abrechnungsschema ziemlich groß ist und die Anzahl der Eigenschaften wachsen kann.

Vielen Dank im Voraus für jede Hilfe.

Antwort

0

Im Idealfall, wenn Sie von Models zu ViewModels konvertieren, haben Sie eine separate Konverterklasse.

In unseren MVC-Projekten haben wir zwei Arten von Wandlern, IConverter<TFrom,TTo> eine Convert Methode definiert, und ITwoWayConverter<TFrom,TTo>ConvertTo und ConvertFrom Methoden definieren.

Wir injizieren unsere Konverter dann in den erforderlichen Controller und verwenden sie für alle unsere Konvertierungen.

Dies hält alles schön und sauber und ermöglicht eine klare Trennung von Bedenken.

public class MonthlySchemeBillingToMonthlySchemeBillingViewModelConverter :  
        IConverter<MonthlySchemeBilling,MonthlySchemeBillingViewModel> 
     { 
     public MonthlySchemeBillingViewModel Convert(MonthlySchemeBilling) 
     { 
      // Impliment conversion 
     } 
     } 
+0

Das entspricht grundsätzlich der Implementierung einer Clone-Methode, oder? Ich hatte gehofft zu vermeiden, manuell alle Eigenschaften zu füllen. – Inertiaboogie

1

Sie nehmen vielleicht einen Blick auf AutoMapper:

Wenn wir diese impliment, würden wir eine neue Klasse speziell für die Art der Umwandlung zu tun, wir suchen erstellen.

+0

Guter Vorschlag! Werde das untersuchen. – Inertiaboogie