我正在构建一个.Net WebApi,我把逻辑抽象出来,这样我就可以使用单元测试来测试它。我使用实体框架,DbContext
是由DI注入的。
数据流如下所示:
[controller] -> [Service] -> [Controller]
为了对服务进行单元测试,我模拟了DbContext和其他所有内容,并测试了服务
[Test] -> [Service] -> [Test]
目前还没什么特别的。
现在,例如,如果我想添加一个兴趣点,然后在服务中,我做这样的事情:
public class CreatePoiService{
public void InsertPoi(PoiData data){
DbContext.Pois.Add(data);
DbContext.SaveChanges();
}
}
这没问题。但是现在我有一个控制台应用程序,它导入了100000个兴趣点。虽然这个控制台应用程序使用了相同的InsertPoi函数,但每次插入后都会调用DbContext.SaveChanges()
,这会减慢速度,因为最好在N次插入后才调用。
所以我给Service类添加了一个函数:
public class CreatePoiService{
private bool SaveToContext = true;
public void InsertPoi(PoiData data){
DbContext.Pois.Add(data);
if(SaveToContext) DbContext.SaveChanges();
}
}
现在我可以在控制台应用程序中调用CreatePoiService.SaveToContext = false
,而不是让EF执行更改。而且我可以在控制台应用程序本身中调用SaveChanges
。这工作得很好。但我仍然怀疑是否有更好的方法来做到这一点?
1条答案
按热度按时间rhfm7lfc1#
正常的模式是您的服务 * 将 * 调用SaveChanges,但您仍然可以跨多个服务调用来限定transaction的范围。
事务将控制服务保存的所有更改的持久性,因为它们都共享一个DbContext示例作为Scoped依赖项。