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 ...如果不在存储库本身,这个错误处理会在哪里生效?
在设计合理的系统中,永远不能违反约束.让您的实体变得更聪明:例如,不要使用盲目自动实现的设置器.
存储库不是进行数据验证的地方.适当的地方是:
这些异常应该出现的唯一时间是运行单元集成测试并且出现故障,这将显示数据库约束与您的实体不匹配,或者您的实体实现不正确.所以你绝对不应该catch这样.
在大多数情况下,存储库不需要担心处理异常。使用存储库的类应该处理这个问题。在您的示例中,如果发生插入错误,为什么要返回 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始终返回有效实例或抛出异常。