2012-11-13 87 views
0

管理員會創建促銷代碼並從預定義規則列表中進行選擇。這些規則約束,如:購物車促銷代碼規則實施

  • Max使用
  • 有效期至
  • 民車小計

我可以將這些規則硬編碼進入代碼或者我可以(希望)將業務邏輯存儲在數據庫表中並在運行中編譯/執行它。每項業務規則都相對簡單,新的規則可以通過網絡管理員創建。我想我可以在創建所述規則時編寫一些測試來在一定程度上驗證代碼邏輯。

將規則邏輯存儲在數據庫中是一個非常糟糕的主意嗎?

我認爲這是愚蠢的硬編碼所有這些規則,並重新編譯每次添加一個新的。

注意:我讀了System.CodeDom會爲我編程。

回答

0

如果你的意思是「在C#中用C#編寫的代碼存儲在數據庫中」,那麼在編譯它時,是的,這是一個壞主意。在將代碼存儲爲數據的項目上工作了數年之後,我可以從經驗中告訴您,這是您會後悔的決定。

這是一個糟糕的主意,最重要的原因是將代碼轉換爲數據意味着您永遠無法更改此代碼可能耦合到的接口/類。這意味着你可以更好地預測和支持你現在可能關心的每個功能,這非常困難。這個自定義代碼也可能是越野車,速度慢,難以調試。

更新:

還有其他的方法來解決這個問題。看待這個問題的一種方法是將對象存儲在數據庫中,這可能與這些類型的類型和參數列表一樣簡單。至於在web ui中配置它們,我首先選擇硬編碼約束並能夠配置參數(例如,設置數據爲ExpirationDataRule)。這可能就夠了。

0

爲什麼不用腳本語言表達規則,並在試圖添加促銷代碼時解釋規則?

擬訂一項

不是存儲需要被編譯(C#或其他方式)的代碼,表達自己的規則在幕後的JavaScript(你可以使用其他腳本語言,如果你喜歡,但JavaScript是無處不在)。然後使用.NET JavaScript實現(JScript或其中一個可用的打開選項)來評估您的JavaScript。所以,你的JS可能是這樣的:

promo.timesUsed < 5 && cart.total >= 35.00 

的Javascript橋樑像JScript.Net和Java的犀牛一般提供採取運行時對象,並將其暴露在腳本方面的能力。所以在我上面的示例中,promocart應該是暴露給腳本上下文的C#對象。你現在唯一需要尊重的是你將暴露給腳本上下文的對象。您可以將腳本文本傳遞給某種eval方法,並返回布爾值。您可以創建各種規則,並且只會受到可用數據的限制。

+0

你能詳細說明一下嗎? –