ViewModel,模型,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");
}
}
}
所以..確定..它並不像短之前,但它是可以接受的。
但是,如果模式演變的是什麼東西,以及自然..
而且它認爲「不重複自己」是一個很好的原則。
在許多情況下,我不需要特定的視圖模型類 - 但不是所有情況。
沒關係。
爲什麼改變整個對象爲中心範式的態度是錯誤的?
在例如:
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();
這是一種錯誤的想法或一個好主意?良好的建築或壞建築?
它的問題仍然存在分歧 - 只是寫法不同而已。
真的把我的頭放在它上面,會很感激你對此的投入。
謝謝。
G.Y.
我同意你寫的一般 - 但不是與 - 模型是不可知的事實,它在mvvm模式中使用..因爲沒有理由在模型中包括inpc,除非你在實踐中使用mvvm - 不過,我確實接受inpc包括在內,正如你所說的完美無缺的oop類。但是它並沒有回答我的問題。我最後一個例子是否提到了「以對象爲中心」或「以模型爲中心」的方法是不是好的做法?如果可以放入inpc,爲什麼不讓模型像示例中那樣處理自己的持久性? – 2013-04-10 11:27:20
在MVVM之外的模型中實現INPC有很多原因。例如,我有計算如果引用的對象的屬性已更改標記自己髒。另一方面,有許多情況下你的模型不需要INPC。 INPC本身並不是MVVM特有的。你只需要一個不同的觸發器來同步你的虛擬機(定期地,或者在推動模型變化之後)。無論如何,這是學術上的......正如我所說,你的方法在我眼中是完全有效的。我已經延長了我的答案。 – Marc 2013-04-10 12:08:07
謝謝,是的 - 它確實滿足我的問題:) – 2013-04-10 14:32:30