2011-01-07 2 views
0

Je crée une application MVC2 pour gérer les schémas de facturation. Ces schémas de facturation peuvent être de divers types, par ex. quotidien, hebdomadaire, mensuel, etc. et tous les types ont leurs propriétés spécifiques. Ma structure de classe ressemble à ceci:ASP.NET MVC2: ViewModel pour une classe polymorphe

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

J'extrayez un système de facturation par la classe de base en utilisant l'ID système de facturation, et il me donne un objet du type correct.

Les SpecificMonths de propriété cartes à une base de données champ varchar qui contient une; chaîne -Séparé de numéros de mois. Je veux diviser cela en un tableau afin que je puisse créer une liste de cases à cocher et je ferais de préférence cela avec une propriété de façade dans un viewmodel. Je pourrais le faire juste à l'intérieur de la vue, mais cela semble aller à l'encontre du modèle MVC. Le problème est que je ne peux créer ce viewmodel spécifiquement pour un BillingSchemeMonthly, et je ne peux pas convertir un BillingSchemeMonthly en BillingSchemeMonthlyViewModel. Je préfèrerais ne pas implémenter une méthode de clonage dans le viewmodel puisque le schéma de facturation complet est assez grand et le nombre de propriétés peut augmenter.

Merci d'avance pour toute aide.

Répondre

0

Idéalement lors de la conversion de modèles à ViewModels vous aurez une classe séparée du convertisseur.

Dans nos projets MVC nous avons deux types de convertisseurs, IConverter<TFrom,TTo> définissant une méthode Convert et ITwoWayConverter<TFrom,TTo> définissant ConvertTo et ConvertFrom méthodes.

Nous Injecter ensuite nos convertisseurs dans le contrôleur nécessaire et les utiliser pour faire toutes nos conversions.

Cela permet de maintenir tout agréable et bien rangé et permet une séparation claire des préoccupations.

Quand nous impliment cela, nous avions créer une nouvelle classe spécifiquement pour le type de conversion que nous cherchons à faire:

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

Cela équivaut essentiellement à l'implémentation d'une méthode Clone, n'est-ce pas? J'espérais éviter de remplir manuellement toutes les propriétés. – Inertiaboogie