2011-01-22 22 views
0

我在我的項目Web/UI,Service,Repository,Common和其他一些我不認爲這個案例重要的項目中有以下幾層。關於數據查找常量的問題

我有一個電子郵件表,它保存所有網站生成的電子郵件數據。我還有一個名爲EmailType的表格,用於跟蹤應該調用電子郵件表格中的哪個電子郵件。

在我的電子郵件服務中,我有以下方法。

public string SendPurchaseConfirmationEmail(string email, string firstName, string dealName) { 
    Email email = EmailRepository.GetByCurrentByType(EmailType.PurchaseEmail.GetStringValue()); 
    variables = createVariablesList(); 
    SendEmail(email.ListId, email.externalEmailId, variables); 
} 

EmailType是一個unum,帶有一個擴展名以獲取value屬性,該屬性是一個guid並存儲在我的存儲庫中。 EmailType表在生成測試郵件的管理員中非常有用,但對於實際的Web層,對服務的調用需要存儲庫中的硬編碼值。

我的問題是,這是最好的或推薦的方式來做到這一點,或者我可以使這種更動態的某種方式嗎?我不喜歡這個部分是我的服務層需要一個每個電子郵件的方法,因爲web層應該觸及存儲庫。

如果分離代碼是一個問題,那麼也會將枚舉放置在服務層中的位置不正確。

感謝,

+0

你是什麼意思下的「網絡層」的術語? – mare 2011-01-22 22:27:55

回答

0

是的,你將需要重複一些「關鍵」值設定在兩個您的「服務」層的電子郵件類型,並在您的數據庫。

如果不使用存儲在您的郵件表(或容易映射到你的數據庫代碼的值不同)的「外鍵」的價值觀,那麼你將需要與執行DB查詢你的電子郵件類型表。

我建議使用整數代理鍵作爲電子郵件類型表,並創建一組命名數字常量映射到需要使用該類型的任何圖層中的代理鍵值(特別是如果該層連接到數據庫本身)。每個其他圖層都應該通過這些圖層中的一個來使用這組名稱常量。

0

改變服務的方法來此

public string SendConfirmationEmail(EmailType selectedType, string email, string firstName, string dealName) {  
    Email email = EmailRepository.GetByCurrentByType(selectedType);  
    variables = createVariablesList();  
    SendEmail(email.ListId, email.externalEmailId, variables); 
} 

至於「網絡層」調用(從視圖呼叫服務),我不知道你在說什麼,但如果它是AJAX調用,那麼你可以使用enum來進行調用。 除了AJAX,我不知道你可以做什麼樣的調用,因爲你基本上在MVC中有GET和POST。 並且當您對控制器操作進行POST時,您可以再次使用枚舉。

像這樣

EmailService.SendConfirmationEmail(EmailType.Purchase, email, fname, dealname); 

當然,如果你讓你的服務方法靜態上面的示例是有效的。