这是编写MVC服务层的有效方法吗?

时间:2011-12-12 18:26:44

标签: asp.net-mvc asp.net-mvc-3

在我的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);
}

这是一种合理的方法吗?我唯一担心的是我可能会丢失服务层中的异常信息。

2 个答案:

答案 0 :(得分:3)

你应该至少记录你的异常(事件日志,文件系统,使用Elmah等)。

您的代码存在的问题是,您永远不会知道生产环境中是否发生了不良事件,或者您无法确切地发现失败的原因(只是代码返回false)。

另外,你永远不应该像你那样处理所有异常(未经过滤的捕获),而只能处理你可以恢复到正常状态的异常。让应用程序崩溃比让它保持在线不稳定要好得多。

  

通过在应用程序代码中捕获非特定异常(例如System.Exception,System.SystemException等)来避免处理错误。有些情况下,处理应用程序中的错误是可以接受的,但这种情况很少见。

有关处理例外和MSDN article

的最佳做法,请参阅此Design Guidelines for Exceptions

答案 1 :(得分:1)

由于您在服务层的Create方法中没有做任何异常,我建议从中删除try / catch。

我仍然会返回true或false来指示创建操作是否成功。但是,我将在调用者中添加try / catch以确保处理异常。在您的情况下,可能在您的控制器操作(或基本控制器中的OnException)。

另一种方法是将try / catch留在Create方法中,但是@Stephane建议用它做一些事情(比如记录它),但你也可以在任何你捕获它的地方记录它。