【问题标题】:How to handle exceptions when using MVC with Entity Framework and Repository pattern将 MVC 与实体框架和存储库模式一起使用时如何处理异常
【发布时间】:2014-08-02 00:37:13
【问题描述】:

我已经阅读了许多教程和示例代码,试图学习单元测试和存储库模式,并且我试图弄清楚如何处理隐式声明类型的异常。

例如,假设我使用以下内容创建和发布对象。

var issue = issueRepository.GetIssueById(issueId);

如果我在 try catch 块中创建此变量,则该变量将仅适用于 try,因此我必须在 try 中包含与此相关的所有内容。我可以将尝试之外的问题声明为新问题,但我一直在阅读的最佳实践建议已经说过尽可能使用隐式。将try catch放在存储库中会更好吗?如果是这样,您将如何将其返回给控制器?

对不起,如果问题是初步的,但我无法找到任何具有这些模式的异常处理的示例代码。

【问题讨论】:

  • 存储库中的代码与针对返回的issue执行的代码无关吗?
  • Id找不到Issue时,是否应该在Repository级别抛出异常?
  • 我什至认为不会在不存在的 ID 上引发异常。也许如果 issueId 是像 -1 (InvalidArgumentException) 但 return null; 和检查它似乎更合适的东西。 (当然,这个例子很可能不是 Exact 案例,而只是一个例子)
  • 到目前为止,我使用此模式没有遇到任何异常,除非在数据库关闭时遇到过一次。所以是的,这只是一个例子,我正在寻找更多的最佳实践方法。

标签: asp.net-mvc entity-framework repository-pattern


【解决方案1】:

一种方式是这样,但这种方式是在Repository 级别推送异常,这将使调用者更加关注业务规则。

public abstract class BaseRepository<TYPE, IDTYPE>
{
  public TYPE GetById(IDTYPE id)
    {
        return getById(id);
    }

   protected abstract TYPE getById(IDTYPE id);
}

public class IssueRepository : BaseRepository <Issue, int>
{
    protected override Issue getById(int id)
    {
        var result = context.Issues.FirstOrDefault(i => i.Id == id);
        // or even do First() which would throw exception if not found

        if (result == null)
        {
            throw new NotFoundException("Issue was not found with Id: {0}", id);
        }
        return result;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 2012-11-17
    • 1970-01-01
    相关资源
    最近更新 更多