DataService实现了IDisposable吗?

本文关键字:IDisposable 实现 DataService | 更新日期: 2023-09-27 18:06:51

服务示例:

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毫无意义,因为我必须首先将其转换为列表(我这样做是因为其他方法调用GetMyList方法,而不首先转换为列表,数据就消失了[因为延迟执行])

我想我在某个地方读过(现在找不到链接)WCF数据服务不实现IDisposable。如果这是真的,那么using语句是没有意义的。

DataService实现了IDisposable吗?

using语句将导致CurrentDataSourceusing块的末尾被处置,而不是在DataService被处置的时候。因此,这不是DataService是否是IDisposable的问题(它不是),而是MyEfModel是否是一次性的(它是)。正如Mr. Disappointment指出的,如果不是这种情况,编译器将阻止您使用using语句。

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

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

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

关于你关于IQueryable等的另一个观点,我通常没有看到WCF方法实现IQueryable<>,因为它们是通过网络连接消耗的。通常首选IEnumerable<>。您没有将查询"强制转换"到List,因为这意味着它已经在列表中了。您正在计算查询以创建一个列表。然后您可以列表强制转换为IEnumerableIQueryable,因为list实现了这些接口。

我最后这样做了:

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

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

这是另一篇关于这个的文章:使用WCF数据服务和EF

返回IQueryable正确方法