2011-12-12 66 views
0

在我的MVC服務層我有代碼,如下面的驗證:這是一種編碼MVC服務層的有效方法嗎?

protected bool ValidateAccount(Account account) 
     { 
      var accounts = _accountRepository.GetPk(account.PartitionKey); 
      if (accounts.Any(b => b.Title.Equals(account.Title) && 
            !b.RowKey.Equals(account.RowKey))) 
       _validationDictionary.AddError("", "Duplicate title"); 
      return _validationDictionary.IsValid; 
     } 

然而,在「動作類型」的方法我吸收與代碼例外是這樣的:

public bool Create(Account account) 
{ 
    if (!ValidateAccount(account)) 
     return false; 
    try 
    { 
     _accountRepository.AddOrUpdate(account); 
    } 
    catch 
    { 
     return false; 
    } 
    return true; 
} 

我控制器這樣編碼:

public ActionResult Create(BaseViewModel vm) 
{ 
    _accountService = new AccountService(new ModelStateWrapper(this.ModelState), vm.Meta.DataSourceID); 
    if (ModelState.IsValid) 
    { 

      _accountService = new AccountService(new ModelStateWrapper(this.ModelState), vm.Meta.DataSourceID); 
      if (!_accountService.Create(vm.Account)) 
       return View("CreateEdit", vm); 
      else 
       return RedirectToAction("Created"); 
     } 
     return RedirectToAction("Home"); 
    } 
    return View("CreateEdit", vm); 
} 

這是一個合理的方法嗎?我擔心的是我可能會失去服務層中的異常信息。

回答

3

你至少應該在日誌你的例外(事件日誌,文件系統,使用Elmah等)。

與您的代碼的問題是,你永遠不會知道,如果事情在生產環境中遭遇不測,否則您將無法發現究竟失敗(剛纔說的代碼返回false)。

此外,像你這樣(未經過濾的捕),但只有你能恢復到正常狀態的一個你永遠不應該處理所有異常。讓應用程序崩潰比保持在線不穩定要好得多。

避免通過捕獲應用程序代碼中的非特定異常(例如System.Exception,System.SystemException等)來處理錯誤。有些情況下,處理應用程序中的錯誤是可以接受的,但這種情況很少見。

看到這個MSDN article的最佳做法處理異常和Design Guidelines for Exceptions

+1

+1這是一個不錯的主意,可以掩蓋更大的問題。一般的經驗法則是抓住你所能做的,讓剩下的泡沫起來。 – James

1

既然你沒有做任何事情與在服務層的製作方法之外,我建議從它移除try/catch語句。

我仍然會返回true或false來指示創建操作是否成功。然而,我會在調用者中添加一個try/catch來確保異常處理。在你的情況,這可能是在你的控制器動作(或在你的基地控制器的OnException)

另一種方法是將try/catch留在你的Create方法,但作爲@Stephane建議做一些事情(如記錄它),但您也可以在任何地方記錄它。

相關問題