2013-04-09 101 views
1

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.

回答

2

關於INotifyPropertyChanged:MVVM要求您在ViewModels上使用它,因爲WPF利用此接口在View和它的DataContext(它是MVVM中的ViewModel)之間進行數據綁定。除此之外,INPC只是一個通知屬性更改的界面,可以在任何地方使用。人們通常認爲它不應該在模型中實現,這是錯誤的,也是你不需要的。你只需要在你的模型上實現INPC,如果你想在某個地方使用它,最常見的可能是在ViewModel中處理這些改變。如果您的模型僅因ViewModel的操作而發生變化,則不需要執行INPC

換句話說:該模型不可知其在MVVM模式中使用的事實。因此,在設計模型時不要考慮整個系統:它提供了更改通知:很好,它提供了持久性功能:很好,它是一個非常好的OOP類。這足以讓模型成爲MVVM的良好模型。

編輯:

問題不在於MVVM具體海事組織。問一個問題是有意義的,無論是表示一個實體(本例中是一個人),通知屬性更改(再次,INPC不是MVVM特有的),並且維護持久性對於一個類來說太多關注。通知和持久性是一種服務功能,您仍然將Dal中的實際邏輯分開。所以,爲什麼不呢,如果在你的應用程序中單獨保存和加載實體是有意義的,你爲什麼介意?你爲什麼不應該那樣做?當然,具有兩個屬性的類將更好,但它總是一種權衡...

簡而言之:我認爲持有數據,保持此數據的持久性並通知更改聽起來像一堆不錯的作業成爲一個班級。

讓我知道這是否滿意地回答你的問題。

+0

我同意你寫的一般 - 但不是與 - 模型是不可知的事實,它在mvvm模式中使用..因爲沒有理由在模型中包括inpc,除非你在實踐中使用mvvm - 不過,我確實接受inpc包括在內,正如你所說的完美無缺的oop類。但是它並沒有回答我的問題。我最後一個例子是否提到了「以對象爲中心」或「以模型爲中心」的方法是不是好的做法?如果可以放入inpc,爲什麼不讓模型像示例中那樣處理自己的持久性? – 2013-04-10 11:27:20

+0

在MVVM之外的模型中實現INPC有很多原因。例如,我有計算如果引用的對象的屬性已更改標記自己髒。另一方面,有許多情況下你的模型不需要INPC。 INPC本身並不是MVVM特有的。你只需要一個不同的觸發器來同步你的虛擬機(定期地,或者在推動模型變化之後)。無論如何,這是學術上的......正如我所說,你的方法在我眼中是完全有效的。我已經延長了我的答案。 – Marc 2013-04-10 12:08:07

+0

謝謝,是的 - 它確實滿足我的問題:) – 2013-04-10 14:32:30