我已經做了大量的研究,包括這裏的SO,我似乎無法找到明確的方向。我目前有一個ASP.NET MVC3應用程序,它有一個位於存儲庫之上的服務層。如何將服務層驗證消息傳回給調用者?
在我的服務層,我具備的功能,如:
public class MyService{
public void CreateDebitRequest(int userId, int cardId, decimal Amount, ....)
{
//perform some sort of validation on parameters, save to database
}
public void CreateCreditRequest(.....)
}
//perform some sort of validation on parameters, save to database
}
public void CreateBatchFile()
{
//construct a file using a semi-complex process which could fail
//write the file to the server, which could fail
}
public PaymentTransaction ChargePaymentCard(int paymentCardId, decimal amount)
{
//validate customer is eligible for amount, call 3rd party payments api call,
//...save to database, other potential failures, etc.
}
}
我見過的人說,參數驗證,是不是很特殊,所以拋出異常是不是很恰當。我也不喜歡傳遞一個參數,比如一個字符串,並檢查一個空值。我已經考慮實現一個ValidationDictionary類,並將它作爲任何給定服務類的屬性(它將包含一個IsValid布爾值和一個錯誤消息列表,並且可以在服務層中的任何給定函數調用後檢查,以查看事情去了)。在運行任何給定的功能後,我可以檢查ValidationDictionary狀態:
var svc = new MyService();
svc.CreateBatchFile();
if (svc.ValidationDictionary.IsValid)
//proceed
else
//display values from svc.ValidationDictionary.Messages...
我不喜歡這個的事情是,我將不得不更新每一個服務層函數調用,以避免它保留舊值(如果我選擇不將它用於許多或大多數函數,則在運行任何給定函數後,仍然會期望它具有有意義的值或空值)。我認爲另一件事是通過在ValidationDictionary每個函數調用可能有詳細的驗證信息,但後來我回使用out參數...
做任何你有建議?我似乎無法弄清楚這樣做的任何干淨方式。有時爲函數返回null是足夠的信息,但有時候我想多一些驗證信息傳遞給調用者。任何意見,將不勝感激!
編輯澄清: 我的服務層不知道它是一個正在使用它的MVC應用程序。服務層只具有某些公用函數,如CreateBatchFile()或AddDebitRequest()。有時,消費者(在這種情況下是一個控制器,但可能是別的東西)返回空就足以知道發生了什麼,有時消費者希望從服務層獲得更多信息(如果消費者是消費者,可以傳遞給ModelState一個控制器)。我怎麼從服務層本身冒出來呢?
嗯......我想我是在談論較低的水平。我們假設用戶已經按下了一個按鈕,並且視圖模型驗證沒有中斷。然後,我的控制器會調用服務層中的一個函數,並且該函數可能由於各種原因而失敗(或者視圖模型驗證比服務實際需要的更慷慨,所以當服務驗證params自身時失敗) 。我如何將這些信息從服務層傳遞迴控制器,甚至可以通過viewmodel或modelstate顯示出來? – Josh 2012-04-11 17:29:03
我確保所有驗證邏輯都存在於視圖模型中。爲什麼你想驗證邏輯遍佈整個地方?輸入驗證屬於用戶界面模塊。如果服務層出現問題,您應該拋出異常,以提供具有更好錯誤消息的日誌記錄。然後,您的MVC應用程序可以根據異常/ http代碼重定向到友好的錯誤頁面。 – Marcus 2012-04-11 19:38:30
假設我在服務層,並驗證傳入CreateDebitRequest(...)的日期將來不會超過三天。似乎我應該在服務層驗證這一點,除了我在鏈中更高的位置進行驗證之外。你會同意嗎?如果是這樣,那麼你認爲我應該在我的服務層執行驗證,但只是在驗證失敗時拋出異常?或者我應該不在服務層驗證這個日期(我會對依賴服務使用者感到緊張)?謝謝... – Josh 2012-04-11 19:55:14