2011-12-12 65 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建议做一些事情(如记录它),但您也可以在任何地方记录它。

相关问题