ASP.NET MVC2: ViewModel для полиморфного класса - PullRequest
0 голосов
/ 07 января 2011

Я создаю приложение MVC2 для управления схемами выставления счетов. Эти схемы выставления счетов могут быть различных типов, например, ежедневно, еженедельно, ежемесячно и т. д., и все типы имеют свои специфические свойства. Моя классовая структура выглядит так:

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

Я извлекаю схему выставления счетов через базовый класс, используя идентификатор схемы выставления счетов, и он дает мне объект правильного типа.

Свойство SpecificMonths сопоставляется с полем varchar базы данных, которое содержит -разделенную строку номеров месяцев. Я хочу разделить это на массив, чтобы я мог создать список флажков, и я бы предпочел сделать это со свойством фасадов в viewmodel. Я мог бы сделать это прямо в представлении, но это, кажется, идет вразрез с шаблоном MVC.

Проблема в том, что я могу создать эту модель только для BillingSchemeMonthly, и я не могу привести BillingSchemeMonthly к BillingSchemeMonthlyViewModel. Я бы предпочел не реализовывать метод клонирования в viewmodel, поскольку вся схема биллинга довольно велика, и количество свойств может возрасти.

Заранее спасибо за любую помощь.

Ответы [ 2 ]

1 голос
/ 07 января 2011

Вы можете взглянуть на AutoMapper .

0 голосов
/ 07 января 2011

В идеале при преобразовании из моделей в ViewModels у вас будет отдельный класс конвертера.

В наших проектах MVC у нас есть два типа конвертера: IConverter<TFrom,TTo>, определяющий метод Convert, и ITwoWayConverter<TFrom,TTo>определение ConvertTo и ConvertFrom методов.

Затем мы вводим наши конвертеры в необходимый контроллер и используем их для всех наших преобразований.

Это делает все красиво и аккуратно и позволяет наглядноразделение проблем.

Когда мы это сделаем, мы создадим новый класс специально для того типа преобразования, который мы собираемся сделать:

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