DataService是否实现了IDisposable?

时间:2011-08-26 19:51:58

标签: c# entity-framework entity-framework-4 wcf-data-services

以下是一个示例服务:

public class MyWcfDataService : DataService<MyEFModel>
{
   [WebGet(ResponseFormat = WebMessageFormat.Json)]
   public IQueryable<GetMyListEF> GetMyList()
   {
      using (MyEfModel context = this.CurrentDataSource)
      {
          return context.GetMyListEF().ToList().AsQueryable();
      }
   }
}

我应该使用using声明吗?它有点让IQueryable毫无意义,因为我必须首先将它强制转换为List(我之所以这样做是因为其他方法调用GetMyList方法并且没有首先转换为列表,因此数据已经消失[因为延迟执行])

我以为我已经在某处找到了(现在找不到链接)WCF数据服务没有实现IDisposable。如果这是真的那么using语句是没有意义的。

2 个答案:

答案 0 :(得分:2)

using语句会导致您的CurrentDataSource被置于using块的末尾,而不会放置DataService。因此,问题不在于DataServiceIDisposable(它不是),而是MyEfModel是否是一次性的(它是)。正如Disappointment先生指出的那样,如果不是这样的话,编译器会阻止你使用using语句。

这意味着在创建新对象时最好使用using块。例如:

using (MyEfModel context = this.GetNewDataSource()) {...}

这样你就不会遇到有人在使用块之后尝试访问CurrentDataSource并遇到异常的可能性。

关于你关于IQueryable等的另一点,我通常没有看到WCF方法实现IQueryable<>,因为它们是通过网络连接消耗的。通常IEnumerable<>是首选。并且您不是将您的查询“转换”到List,因为这意味着它已经在列表中。您正在评估查询创建列表。然后,您可能

答案 1 :(得分:0)

我最终选择了这个:

[WebGet(ResponseFormat = WebMessageFormat.Json)]
public IQueryable<GetMyListEF> GetMyList()
{
    return this.CurrentDataSource.GetMyListEF();
}

不需要using语句,因为WCF数据服务将在请求结束时部署CurrentDataSource。使用IQueryable还允许使用延迟加载,即延迟执行。

这是另一篇文章: Proper way to return IQueryable using WCF Data Service and EF