9

我看过的关于存储库模式的示例都没有包含任何类型的错误处理。为什么是这样?比如说我有这个:

public virtual TItem Insert<TItem>(TItem item) where TItem:class,new()
    {
        dbContext.Set<TItem>().Add(item);
        try
        {
            dbContext.SaveChanges();
        }
        catch (DbUpdateException)
        {

            return null;
        }

        return item;

    }

我们违反约束的实例。我捕获了 DbUpdateException... 如果不在存储库本身中,此错误处理将在哪里进行?

4

2 回答 2

9

在一个设计合理的系统中,约束永远不能被违反。让您的实体更智能:例如,不要使用盲目的自动实现的设置器。

存储库不是进行数据验证的地方。合适的地方是:

  • 如果您只是检查“合同”约束,例如“数量应该是非负整数”或“不要将空客户传递给我”,则将逻辑放入实体本身(设置器或构造器或变异方法,视情况而定) .
  • 如果您正在检查业务逻辑,请将其放入抽象出该逻辑的专用对象(如果您愿意,则为 DDD 规范)。

这些异常应该出现的唯一一次是当您运行单元集成测试并且您遇到失败时,这将表明您的数据库约束与您的实体不匹配,或者您的实体实现不正确。所以你绝对不应该catch他们。

于 2011-04-06T03:41:04.490 回答
3

在大多数情况下,存储库不需要担心处理异常。使用存储库的类应该处理这个问题。在您的示例中,如果发生插入错误,为什么要返回 null ?这不是比仅仅抛出异常更清楚吗?

例如,假设我们要通过存储库插入一条记录,然后打印出新的 ID。假设插入将因任何原因失败。

var myNewItem = myRepository.Insert(myItem);
Console.WriteLine("MyItem added with ID: {0}", myNewItem.ID);

按照您问题中的模式,如果失败,您将NullReference在第二行获得异常。Insert这有点奇怪。DbUpdateException在第一行看到更清楚。最好能够Insert总是返回一个有效的实例或抛出一个异常。

于 2011-04-06T03:56:22.413 回答