了解 WebView/WinForm 中的 Model 和 ViewModel in MVP/MVC



我正在尝试理解和实现 .NET 中的不同 UI 模式,以查看优缺点以及它们最适合的位置。

我理解主要概念,但我正在创建一个应用程序并出现一个问题。

假设我们有一个类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 来显示所有客户,我可以使用此类将源设置为 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拥有的所有属性以及它的所有逻辑(方法(。我只加载我需要的那些,但这对我来说真的很糟糕。

第三个选项是将包含所有属性和方法的大类作为我的(域(模型,并在每次我需要显示 sth 时创建一个"ViewModel"(不包含任何方法,只包含 props(。 如上所述,将其用作我的 GridView 的源代码。这是具有更多类和代码(大类 + 视图模型 +(也许(DTO (的解决方案,但在我看来也是更有条理和更可靠的设计......在这里,使用像AutoMapper这样的映射器将真正有所帮助,在对象之间进行映射

但这是我感到困惑的部分...

  • 这些"视图模型"是使用 MVC 或 MVP 的不良模式吗?

  • 这是否与 MVVM 中的 VM 相同?我认为不是,因为我已经将 MVVM 中的 VM 理解为"模板",但我所说的在我看来更像是 DAO??

  • 或者他们不是无所事事,只是DAO

我想我对不同设计模式中模型,视图模型等的所有不同含义有点困惑。

我几乎没有试图理解正确的 MVC、MVP、MVVM 和 DDD,我认为有时我会混合术语......?

首先,尽量不要"混合"来自不同模式的东西,ViewModels是针对MVVM的,如果你想实现MVVM,你需要ViewModels(ASP.Net MVC使用称为ViewModels的东西,但它与MVVM设计模式中的ViewModels不同(

视图模型就像视图的模型。ViewModel 的工作是将模型"转换"为 View 可以理解的内容。

您可以有一个或多个模型(或没有(并在视图模型中使用它,每个视图都有一个视图模型。

在您的示例(数据网格视图(中,您可以有一个模型来表示数据网格视图中的数据,如果需要,也可以有一个DTO,并且可以在视图模型中有一个属性,一个列表,您将填充从数据库加载的数据。在视图中,您将该属性(列表(绑定到 dgv 数据源。

认为 ViewModel 类似于视图背后的代码,但您正在使用的属性和命令将绑定到视图中的 controla。

最新更新