ViewModel、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{ 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;
}
}
几个月后,引入了自动属性,事情再次变得容易:
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 : INotifyPropertyChanged
{
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");
}
}
}
所以..好的..它不像以前那么短,但它是可以接受的。
但是,如果模型的演变是某种东西,那么自然..
并且一致认为“不要重复自己”是一个很好的原则。
在许多情况下,我不需要特定的 View-Model 类 - 但并非在所有情况下都需要。
没关系。
为什么改变对以对象为中心的范式的整个态度是错误的?
例如:
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;
}
}
所以我可以在模块中的某个地方做,例如:
myObj.Persist();
这是一个错误的想法还是一个好主意?好架构还是坏架构?
其中仍然存在关注点分离 - 只是写法不同。
真的让我头疼,将不胜感激您对此的投入。
谢谢。
GY