在使用 EF DBContext 时发出 Http 请求

本文关键字:Http 请求 DBContext EF | 更新日期: 2023-09-27 18:34:04

所以这是代码:

using(var dbContext = contextFactory.GetContext())
{ 
     foreach(item in dbContext.Items)
     {
        try
        {
          var result = IRemoteWebService.SomeOperation(item);
        }
        catch(MyException e)
        {
             //assume that all possible exceptions are caught
        }
     }
}

问题:据我所知,这样做唯一可能的问题是 http 调用超时,对于初始 Web 请求和使用 DbContext 内部发出的 Web 请求,这可能不同。这样做还有哪些其他可能的缺点?

在使用 EF DBContext 时发出 Http 请求

这被认为是不好的做法,因为你正在混合责任。调用 HTTP 服务时,数据库连接将保持打开状态。

为了更具体:想象一下HTTP服务器中的停顿和这个特定函数的高负载。在这种情况下,您将同时打开多个数据库连接。这可能会导致不必要的副作用。例如Record locking(尤其是当您还使用写入操作时(,或者您甚至可以达到最大数据库连接计数。

更好的方法是先获取数据,而不是调用HTTP服务。代码可能更像这样:

List<Items> items = null;
using(var dbContext = contextFactory.GetContext())
{ 
     items = dbContext.Items.ToList(); //query all the items
}
//now loop the items
foreach(item in items )
{
    try
    {
        var result = IRemoteWebService.SomeOperation(item);
    }
    catch(MyException e)
    {
        //assume that all possible exceptions are caught
    }
}

如果你为数据查询和http-call创建单独的方法(甚至将它们放在不同的类中(,那就更好了。通过这种方式,您可以更好地重用代码,并且更容易维护,更灵活 en 更好的可测试性。

至于一般说明:最好在尽可能短的时间内保持连接(db,http,tcp/ip,文件系统等(,图形,锁等打开状态。当然,有一些性能优化论据可以争论这个说法,但这些论点很少有效,因为代码复杂性会增加。