C# 模型演化与建筑设计查询
视图模型,模型,MVVM架构问题 从前,我曾定义一个模型类,如下所示:C# 模型演化与建筑设计查询,c#,.net,oop,mvvm,model,C#,.net,Oop,Mvvm,Model,视图模型,模型,MVVM架构问题 从前,我曾定义一个模型类,如下所示: public class Person { public string FirstName; public string LastName; } public class Person { private string firstName; private string lastName; public string FirstName {get{ return firstName;} set{ re
public class Person
{
public string FirstName;
public string LastName;
}
public class Person
{
private string firstName;
private string lastName;
public string FirstName {get{ return firstName;} set{ return firstName; } }
public string LastName {get{ return lastName; } set{ return lastName; } }
}
几年后,我明白了如下定义模型类是一个更好的主意:
public class Person
{
public string FirstName;
public string LastName;
}
public class Person
{
private string firstName;
private string lastName;
public string FirstName {get{ return firstName;} set{ return firstName; } }
public string LastName {get{ return lastName; } set{ return lastName; } }
}
为什么。。因为通常它允许更多的通用性,例如:
public class Person
{
private string firstName;
private string lastName;
public string FirstName {get{ return firstName;} private set{ return firstName; } }
public string LastName {get{ return lastName; } private set{ return lastName; } }
public Person(string firstName, string lastName)
{
this.firstName = firstName;
this.lastName = lastName;
}
}
publie interface IPersistable
{
Guid Id {get;set;}
DataAccessLayer Dal {get;set}
void Persist();
void Populate();
}
public class Person : INotifyPropertyChanged, IPersistable
{
public DataAccessLayer Dal;
private Guid Id;
public Guid Id
{
get {return id;}
set
{
id=value;
if(PropertyChanged!=null)
PropertyChanged(this,new PropertyChangedEventArgs("Id");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private string firstName;
private string lastName;
public string FirstName
{
get{ return firstName; }
set
{
firstName = value;
if(PropertyChanged!=null)
PropertyChanged(this,new PropertyChangedEventArgs("FirstName");
}
}
public string LastName
{
get{ return lastName; }
set
{
lastName = value;
if(PropertyChanged!=null)
PropertyChanged(this,new PropertyChangedEventArgs("LastName");
}
}
public void Persist() //assume this is part of IPersistable.
{
Dal.Persist(this);
}
public void Populate() //assume this is part of IPersistable.
{
var t=Populate(Id);
FirstName = t.Firstname;
LastName = t.LastName;
}
}
几个月后,汽车性能推出,事情再次变得简单:
public class Person
{
public string FirstName {get; set;}
public string LastName {get; set;}
}
而通用性仍然存在:
public class Person
{
public string FirstName {get; private set;}
public string LastName {get; private set;}
public Person(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}
}
如果我们去上课的时候没有私人教练,那就再好不过了:
var myInstance = new Person{FirstName = "Che", LastName="Guara"}
到目前为止,非常好
但现在我们有了MVVM真正希望我们使用的另一个演变。。(在模型中!)
所以。。好啊它不像以前那么短,但可以接受
但如果模型的演变是某种东西的话,那么很自然
大家一致认为“不要重复你自己”是一个好原则
在许多情况下,我不需要特定的视图模型类,但并非所有情况下都需要
没关系
为什么改变对以对象为中心范式的整体态度是错误的
例如:
public class Person
{
private string firstName;
private string lastName;
public string FirstName {get{ return firstName;} private set{ return firstName; } }
public string LastName {get{ return lastName; } private set{ return lastName; } }
public Person(string firstName, string lastName)
{
this.firstName = firstName;
this.lastName = lastName;
}
}
publie interface IPersistable
{
Guid Id {get;set;}
DataAccessLayer Dal {get;set}
void Persist();
void Populate();
}
public class Person : INotifyPropertyChanged, IPersistable
{
public DataAccessLayer Dal;
private Guid Id;
public Guid Id
{
get {return id;}
set
{
id=value;
if(PropertyChanged!=null)
PropertyChanged(this,new PropertyChangedEventArgs("Id");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private string firstName;
private string lastName;
public string FirstName
{
get{ return firstName; }
set
{
firstName = value;
if(PropertyChanged!=null)
PropertyChanged(this,new PropertyChangedEventArgs("FirstName");
}
}
public string LastName
{
get{ return lastName; }
set
{
lastName = value;
if(PropertyChanged!=null)
PropertyChanged(this,new PropertyChangedEventArgs("LastName");
}
}
public void Persist() //assume this is part of IPersistable.
{
Dal.Persist(this);
}
public void Populate() //assume this is part of IPersistable.
{
var t=Populate(Id);
FirstName = t.Firstname;
LastName = t.LastName;
}
}
因此,在a模块中的某个地方,我可以执行以下操作:
myObj.Persist();
这是一个错误的想法还是一个好主意?好的建筑还是坏的建筑
其中仍然存在关注点的分离——只是写得不同而已
真是让我头疼,谢谢你在这方面的意见
谢谢
G.Y.关于<代码>INotifyPropertyChanged:MVVM要求您在ViewModels上使用它,因为WPF利用此接口在视图与其
DataContext
之间进行数据绑定,后者是MVVM中的ViewModel。除此之外,INPC
只是一个通知属性更改的界面,可以在任何地方使用。人们通常认为它不应该在模型中实现,这是错误的,但您也不必这样做。如果您想在某个地方使用它,您只需要在您的模型上实现INPC
,可能最常用于处理ViewModel中的这些更改。例如,如果模型仅因ViewModel的操作而更改,则无需实现INPC
换句话说:模型不知道它在MVVM模式中使用的事实
因此,在设计模型时不要过多地考虑整个系统:它提供了更改通知:很好,它提供了持久性函数:很好,它是一个非常好的OOP类。这就足以使该模型成为MVVM的良好模型
编辑:
问题不是MVVM特定的imo。有必要问,对于一个类来说,表示实体(在本例中是个人)、通知属性更改(同样,INPC不是MVVM特定的)和维护持久性是否太多问题。通知和持久性是一种服务功能,您仍然可以在Dal中分离实际逻辑。那么,如果在应用程序中单独保存和加载实体是有意义的,为什么不呢?为什么你不应该那样做,你真正关心的是什么?当然,一个有两个属性的类会更好,但它总是一个折衷方案
简言之:我认为保存数据、维护数据的持久性和通知更改听起来像是一个很好的工作包,可以放入一个类中
让我知道这是否能令人满意地回答您的问题。我同意您所写的内容—一般来说—但不同意—model不知道它在mvvm模式中使用的事实。。因为没有理由在模型中包含inpc,除非您在实践中使用mvvm——但是我确实接受,所包含的inpc正如您所说是完美的oop类。然而,它并没有回答我的问题。。我在示例中提到的最后一个类是否意味着“以对象为中心”方法或“以模型为中心”方法的不同方法是好的做法?如果可以使用inpc,为什么不让模型以示例所示的方式处理自己的持久性呢?除了MVVM之外,在模型中实现inpc还有很多原因。例如,如果引用对象的属性已更改,我的计算会将自身标记为脏。另一方面,在很多情况下,您的模型不需要INPC。INPC本身并不特定于MVVM。您只需要一个不同的触发器来同步您的VM(周期性地,或者在将更改推送到模型之后)。不管怎样,这是学术性的。。。正如我所说,在我看来,你的方法是完全正确的。我已经扩展了我的答案。谢谢,是的-它确实满足了我的问题:)