與MVC

2017-03-05 32 views
0

計算字段我想完全接受由MVC方法提供關注點分離,但已經達到了,我會在感激的建議路障的東西。 你如何處理/應該在哪裏放置未存儲在數據庫後端的字段的代碼,但可以直接從它派生出來?與MVC

例如,我可以具有表示人的模型。存儲的信息可能包括他們的出生日期。顯然,我可以從中計算出他們當前的年齡,但不會將其存儲在數據庫中。現在,我想用Lambda將年齡作爲一個字段來訪問人物(可能選擇某個年齡段的所有人)。但是,如果我將代碼放入模型中,我是否沒有打破關注的分離?即使我確實把它放在那裏,當通過get訪問字段時還是在創建對象時計算它是否應該計算?對DOB的改變如何?年齡是否應立即反映新價值,還是僅在記錄被寫回時?

讓我們假設,就事論事,該計算需要顯著的時間來處理,所以我們要減少其使用。

我希望這個問題是有道理的!

+0

一個只讀場(一個用'GET'並沒有'set')的模式似乎像人們理想的地方,把這個邏輯。你試過了嗎?有錯誤嗎? – David

+0

是的,沒有錯誤。但是我不知道各種Lambda函數查詢get的頻率如何?如果我正在做一個排序並且對每個比較都進行查詢會怎麼樣?那麼,當然,我的get函數可能被稱爲很多次!此外,我試圖找出「正確」的方式來做到這一點 - 分離擔憂。如果不是「正確」,是否有「更好」? – Paul

+0

那有什麼問題?如果計算結果很重要,但結果很少發生變化,那麼您可以將結果值緩存到專用變量中,然後在影響計算的數據元素髮生更改時隨時緩存該緩存。 – David

回答

2

由於Age領域將只顯示/需要的一些看法它將使意義有相應的視圖模型此屬性。你可以有一個功能,將採取Person實例並計算其年齡。所以,你的控制器看起來是這樣的:

public ActionResult Index(int id) 
{ 
    Person person = GetFromDB(id); 
    PersonViewModel viewModel = Map(person); 
    return View(viewModel); 
} 

Map方法中:

public PersonViewModel Map(Person person) 
{ 
    var result = new PersonViewModel(); 
    result.Age = GetAge(person.Dob); 
    ... some other fields 
    return result; 
} 

現在Age物業將提供給相應的視圖,並可以在不重新計算被多次訪問。