2009-10-12 70 views
1

在我的應用程序中,我總是最終實現一個模型 - 視圖 - 演示者模式,並通常最終從屏幕上用get屬性報廢我的視圖對象。更好的方法來處理屏幕刮對象

例如

Person IBasicRegistration.Person 
{ 
get 
{ 
    if (ViewState["View.Person"] == null) 
    ViewState["View.Person"] = new Person(); 

    var Person = (Person) ViewState["View.Person"]; 

    Person.Email = txtEmail.Text.Trim(); 
    Person.FirstName = txtFirstName.Text.Trim(); 
    Person.LastName = txtLastName.Text.Trim(); 
    Person.Zip = txtZip.Text.Trim(); 
    Person.Phone = txtPhone.Text.Trim(); 
    Person.ResidentPersonLicenseState = 
     EnumerationParser.Parse<States?>(ddState.SelectedValue); 

    return Person; 
} 
} 
調試時我在演示/型號,我得到我的get {}財產的相當多的遍歷訪問IBasicRegistration.Person我注意到在

不過。

我開始認爲這種模式看起來與INotifyPropertyChanged模式非常相似,我開始考慮實現一個類似的模式,並讓每個文本字段實現一個OnChanged事件,以更新它在位於視圖狀態的person對象中的相關值然而,我進一步想到,每次有人在某個領域內嘲諷時,都需要大量的服務器請求,並且似乎在某些時候會導致可伸縮性問題。

我的下一個想法它只是有意義創建IsDirty標誌,並纏上了我的代碼,其中倒是類似領域:

Person IBasicRegistration.Person 
{ 
get 
{ 
    if (ViewState["View.Person"] == null) 
    ViewState["View.Person"] = new Person(); 

    var Person = (Person) ViewState["View.Person"]; 

    if(IsDirty) 
    { 
     Person.Email = txtEmail.Text.Trim(); 
     ...others 

     IsDirty = false; 
    } 

    return Person; 
} 
} 

而且在調用回發的任何方法,設置(即通常只是提交按鈕)來設置IsDirty = true,然後它將無緣無故地重複許多工作。

有沒有人想出一些更優雅的任務?

+0

我會說你的概念是相當深思熟慮的。如果它已經實施並正在工作,那麼也許你應該堅持下去。當然,除非有人提出真正優雅和容易實施的東西。 – 2009-10-12 15:18:11

+2

「scrap」與「scrape」是不同的詞,「scrapping」與「scraping」是不同的詞。 – endolith 2009-10-16 14:03:53

+0

非常有見地的評論先生納粹語法。 – 2009-10-16 16:45:31

回答

2

我認爲斷開連接發生的地方在於您在創建視圖時通常實現視圖。一種典型的情況是表單實現了一個視圖接口,然後在應用程序對象中註冊自己(或註冊)。然後,無論何時您需要查找爲某人使用視圖的各種屬性輸入的內容。

例如,找出你的名字進入你會去

myVariable = PersonView.FirstName(); 

在你的榜樣,你是拉視圖的每次訪問人時的狀態。即使你只是想要電子郵件,你將所有內容都放在一個狀態變量中。

現在這個如果數據結構Person是你的模型的一部分。那麼這可以是好的。當它被改變時,你將其拉出一次。修改或將其添加到模型中,然後其他所有內容(報告等)將查看模型。

但是,您的問題表明它正在被一遍又一遍地重擊。這導致我認爲人們由於各種原因直接從視圖中訪問。在這種情況下,我會將屬性放在允許訪問單個成員的視圖上。

或者我會重構設計,以便所有內容都使用數據模型,並在每次更改視圖時更新模型。我懷疑你現在可能不想這樣做,因此最好的方法是使用單獨的屬性。

+0

將所有內容暴露出來的缺點只是屬性:PersonFirstName,PersonLastName等,它所要做的就是延遲將它們全部拖入人物對象中,或者將我的模型方法從使用人物對象中取代並取出巨大的參數列表。我想我可以接受使用屬性列表打包我的視圖,而不是使用單個對象,這些屬性表示如果有人可以提出一個令人信服的論點,說明爲什麼這違反了任何現代設計慣例。 – 2009-10-19 12:55:14

+1

您的人員對象駐留在某處的模型中。您的演示者應該足夠聰明,可以從視圖中拉出並更新模型。不管它拉動一個人物還是一個單一的財產都沒關係。優點是,允許訪問屬性是,您可以從視圖中儘可能多或少量地獲取所需的內容。 用你目前的方法,你被困在從視圖中拉出整個人物。你仍然可以在那些有意義的命令中使用該功能。但有了物業,當你只想要一件事物時,你有一種明確的辦法可以提取一件物品。 – 2009-10-20 12:35:38