使用EF DBContext时发出Http请求

时间:2016-02-10 10:00:02

标签: c# entity-framework

所以这是代码:

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呼叫超时,对于使用DbContext内部的初始Web请求和Web请求,这可能会有所不同。这样做有什么其他可能的缺点?

1 个答案:

答案 0 :(得分:1)

这被认为是不好的做法,因为你正在混合责任。调用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
    }
}

如果您创建sepperate方法(甚至将它们放在不同的类中),对于您的数据查询和http-call,会更好。这样,您可以更好地重用代码,并且更易于维护,更灵活,更易于测试。

至于一般注意事项:最好尽可能在最短的时间内保持连接(db,http,tcp / ip,文件系统等),图形,锁等操作。当然有性能优化参数可以证明这个陈述,但这些参数很少有效,因为代码复杂性会增加其代价。