Понимание Model & ViewModel в WebView / WinForm в MVP / MVC - PullRequest
0 голосов
/ 04 июля 2018

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

Я понимаю основную концепцию, но я создавал приложение, и возник вопрос.

Скажем, у нас есть класс Customer, который представляет основную информацию о клиенте.

public class Customer
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Address { get; set; }
        public string City { get; set; }
        public string Country { get; set; }
        public string PostalCode { get; set; }
        public string PhoneNumber { get; set; }
    }

Теперь, если я создам WebView или WebForm, чтобы показать всем клиентам, я могу использовать этот класс, чтобы установить в качестве источника f.e. для DGV, имея возможность показать все свойства выше.

Но затем я хочу показать, например, представление / форму с историей доходов каждого клиента.

Итак, есть класс CustomerRevenue, как

public class CustomerRevenue
    {
        public Revenue ActualYearExpectedRevenue { get; set; }
        public IList<Revenue> RevenuePerYearList { get; set; }
        public decimal ActualYearProjectedRevenue => CalculateYearProyection();

        public decimal CalculateYearProyection(int year)
        {
            var daysInYear = DateTime.IsLeapYear(year) ? 365 : 366;
            var actualYearRevenue = RevenuePerYearList.SingleOrDefault(x => x.Year == year);
            var dayNumber = DateTime.Now.DayOfYear;
            var projection =  ((actualYearRevenue.Amount * daysInYear) / dayNumber);
            return projection;
        }
    }

Здесь, чтобы установить RevenuePerYearList, нам нужно время, так как, скажем, мы продаем много и имеем огромный список продаж с огромными списками статей, поэтому для расчета требуется некоторое время.

Итак, теперь мой вопрос:

Должен ли я тогда иметь "конкретные" классы для каждого вида / модели с данными, которые я хочу показать, то есть здесь у меня было бы кроме Customer класса, скажем, CustomerRevenueModel

public class CustomerRevenueModel
    {
        private readonly CustomerRevenue _customerRevenue = new CustomerRevenue();
        public int Id { get; set; }
        public string Name { get; set; }
        public string Address { get; set; }
        public string City { get; set; }
        public string Country { get; set; }
        public string PostalCode { get; set; }

        public CustomerRevenue CustomerRevenue
        {
            get { return _customerRevenue; }
        }
    }
}

, который имеет (может быть) различные свойства, поэтому мне нужно при необходимости загружать эти "тяжелые" свойства

или

я должен остаться только с одним классом (я имею в виду, у клиента всегда есть доход) и оставить свойства "пустыми"?

Первый вариант дает мне много классов, по одному на каждое представление / форму, для которых я хочу показать данные (возможно, возможность многократного использования некоторых моделей в различных представлениях / формах), но сохраняет все в чистоте и в действительном состоянии. А также у каждого класса может быть своя собственная логика (логика предметной области - DDD)

Второй вариант - это меньше классов, меньше кода, но каким-то образом я получаю огромный класс (Бог) со всеми свойствами, которые есть у Customer, и всей его логикой (методами). Я загружаю только те, которые мне нужны, но мне это кажется очень плохим.

Третий вариант заключается в том, чтобы иметь большой класс со всеми свойствами и методами в качестве моей (доменной) модели, и создавать «ViewModel» (которая не содержит методов, только реквизиты) каждый раз, когда мне нужно показать что-н. как выше, используя его в качестве источника для моего GridView. Это решение с большим количеством классов и кода (большой класс + ViewModels + (возможно) DTO), а также с более организованным и твердым дизайном для моих глаз ... Здесь использование Mapper, такого как AutoMapper, действительно поможет, отображая объекты

Но это та часть, в которой я запутался ...

  • Являются ли эти "ViewModels" плохим паттерном, использующим MVC или MVP?

  • Это то же самое, что виртуальная машина в MVVM? Что я не думаю, так как я понимал VM в MVVM как «шаблон», но то, о чем я говорю, мне кажется больше похожим на DAO ??

  • Или они не имеют ничего общего, просто DAOs

Я думаю, что я немного запутался во всех различных значениях Model, ViewModel и т. Д. В различных шаблонах проектирования.

Я едва пытаюсь понять правильные MVC, MVP, MVVM и DDD, и я думаю, что иногда я смешиваю термины ...?

1 Ответ

0 голосов
/ 05 июля 2018

Во-первых, постарайтесь не «смешивать» вещи из разных шаблонов, ViewModels предназначены для MVVM, и вам НУЖНЫ ViewModels, если вы хотите реализовать MVVM (ASP.Net MVC использует нечто, называемое ViewModels, но это не то же самое, что ViewModels в схеме проектирования MVVM)

ViewModel похож на модель для View. Работа ViewModel состоит в том, чтобы «преобразовать» модель (-ы) во что-то, что может понять представление.

Вы можете иметь одну или несколько моделей (или ни одной) и использовать ее в ViewModel, у вас есть ViewModel для каждого View.

В вашем примере (представление данных) у вас может быть модель, которая будет представлять данные в представлении данных, DTO, если вы хотите, и у вас может быть свойство в ViewModel, List, и вы будете заполнять данными, загруженными из база данных. В представлении вы свяжете это свойство (список) с источником данных dgv.

Думайте, что ViewModel - это что-то вроде кода позади представления, но вы работаете со свойствами и командами, которые будут связаны с controla в представлении.

...