尝试Catch in Repository

Cod*_*mmr 8 c# domain-driven-design ddd-repositories entity-framework-4

我在Repository Patterns中看到的所有示例都没有包含任何类型的错误处理.为什么是这样?比方说我有这个:

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;

    }
Run Code Online (Sandbox Code Playgroud)

我们违反约束的实例.我抓住了DbUpdateException ...如果不在存储库本身,这个错误处理会在哪里生效?

Dom*_*nic 9

在设计合理的系统中,永远不能违反约束.让您的实体变得更聪明:例如,不要使用盲目自动实现的设置器.

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

  • 如果您只是检查"契约"约束,例如"数量应该是一个非负整数"或"不要传递给我一个空客户",那么将逻辑放在实体本身(设置者或构造函数或变异方法,视情况而定) .
  • 如果您正在检查业务逻辑,请将其放在专门的对象(如果您愿意,DDD规范)中,以抽象出该逻辑.

这些异常应该出现的唯一时间是运行单元集成测试并且出现故障,这将显示数据库约束与您的实体不匹配,或者您的实体实现不正确.所以你绝对不应该catch这样.


rsb*_*rro 3

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

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

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

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