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
语句是没有意义的。
using
语句将导致CurrentDataSource
在using
块的末尾被处置,而不是在DataService
被处置的时候。因此,这不是DataService
是否是IDisposable
的问题(它不是),而是MyEfModel
是否是一次性的(它是)。正如Mr. Disappointment指出的,如果不是这种情况,编译器将阻止您使用using
语句。
这意味着using
块最好在创建新对象时使用。例如:
using (MyEfModel context = this.GetNewDataSource()) {...}
这样你就不会遇到有人在using块之后尝试访问CurrentDataSource
并遇到异常的可能性。
关于你关于IQueryable等的另一个观点,我通常没有看到WCF方法实现IQueryable<>
,因为它们是通过网络连接消耗的。通常首选IEnumerable<>
。您没有将查询"强制转换"到List,因为这意味着它已经在列表中了。您正在计算查询以创建一个列表。然后您可以将列表强制转换为IEnumerable或IQueryable,因为list实现了这些接口。
我最后这样做了:
[WebGet(ResponseFormat = WebMessageFormat.Json)]
public IQueryable<GetMyListEF> GetMyList()
{
return this.CurrentDataSource.GetMyListEF();
}
不需要using
语句,因为WCF数据服务将在请求结束时处理CurrentDataSource
。使用IQueryable
还允许使用延迟加载,也就是延迟执行。
这是另一篇关于这个的文章:使用WCF数据服务和EF