ASP.NET MVC2:用于多态类的ViewModel

时间:2011-01-07 10:00:17

标签: c# asp.net asp.net-mvc-2 polymorphism viewmodel

我正在制作一个MVC2应用程序来管理计费方案。这些计费方案可以是各种类型的,例如,每日,每周,每月等,所有类型都有其特定的属性。我的班级结构如下:

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

我使用计费方案ID通过基类检索计费方案,它为我提供了正确类型的对象。

属性SpecificMonths映射到数据库varchar字段,该字段包含: - 分隔的月号字符串。我想将其拆分为一个数组,以便我可以创建一个复选框列表,我最好在viewmodel中使用facade属性执行此操作。我可以在视图中做到这一点,但这似乎违背了MVC模式。

问题是我只能为BillingSchemeMonthly专门创建这个viewmodel,而且我不能将BillingSchemeMonthly转换为BillingSchemeMonthlyViewModel。 我宁愿不在viewmodel中实现克隆方法,因为整个计费方案非常大,而且属性的数量可能会增长。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您可以查看AutoMapper

答案 1 :(得分:0)

理想情况下,从模型转换为ViewModel时,您将拥有一个单独的转换器类。

在我们的MVC项目中,我们有两种类型的转换器,IConverter<TFrom,TTo>定义Convert方法,ITwoWayConverter<TFrom,TTo>定义ConvertToConvertFrom方法。

然后我们将转换器注入必要的控制器并使用它们来完成所有转换。

这使一切变得干净整洁,并且可以清楚地分离问题。

当我们提出这个问题时,我们会专门为我们要做的转换类型创建一个新类:

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