2012-01-13 99 views
2

我有一個EDM用於恢復DAL項目中的「產品」實體集合。 MVC網站項目引用並直接實例化ObjectContext並向網站返回一個IQueryable用於產品的分頁和顯示。使用外部參數的實體框架自定義屬性

這個實體,爲了簡化事情,我們會說只有「ID」,「Rate」和「Description」屬性。我想創建另一個名爲「CostPerMonth」的計算屬性,它將從網站上獲取名爲「LoanAmount」的輸入,並且爲了簡單起見,此「CostPerMonth」屬性將由((「LoanAmount」*「率「)/ 12)。

我不禁覺得這個計算應該在DAL項目中完成,以使代碼更加可重用,因爲無論使用何種數據,總會指定一個「LoanAmount」。可能的解決方案我已經低於:

  • 創建產品的部分類,一個新的屬性「CostPerMonth」添加到產品。在網站控制器中,當數據返回時,通過遍歷返回的數據並進行計算來填充這個新列:

  • 爲Product創建一個部分類,爲Product添加一個新屬性「CostPerMonth」。在DAL項目中,創建一個輔助類,該類有一個接受「LoanAmount」參數並返回List的方法。這樣做的麻煩是我需要實現數據才能進行計算。該方法可以接受可用於返回產品的Linq查詢中的「Skip」和「Take」參數?

  • 爲Product創建一個部分類,爲Product添加一個新屬性「CostPerMonth」。在使用WCF Web服務的解決方案中添加另一個層,在服務方法內進行計算並使用REST將數據返回給MVC網站?

任何意見將非常感激。

最好的問候,

馬克

回答

1

如果我們退後一步,實際上破壞你問你的問題可能更容易解釋我的答案。

  • 我們有名爲Products的對象/實體
  • 有一個計算字段將在((「LoanAmount」 *「率」)/ 12)
  • CostPerMonth並不需要被存儲在數據庫

所以這個計算的字段是產品實體的業務規則。鑑於您使用的是MVC,只有一個地方可以使用此代碼/邏輯,這就是模型。

鑑於您使用EF它將映射/計算字段和代碼給你一個想法會是這個樣子非坐....

[NotMapped] 
    public decimal CostPerMonth 
    { 
     get { return (LoanAmount * Rate)/12 ; } 
    } 

我可以去約天關於在各個層面上分散業務邏輯的問題。

現在,如果您希望您的此邏輯能夠被其他客戶端輕鬆使用,則需要公開服務來執行此操作。 (你可以使用webAPI /服務堆棧/ wcf等),這實際上是根據你的需要的另一個完整的問題。但這裏的要點是,你的邏輯是在一個地方。