Реализует ли DataService IDisposable? - PullRequest
       57

Реализует ли DataService IDisposable?

1 голос
/ 26 августа 2011

Вот пример службы:

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 бессмысленно.

Ответы [ 2 ]

2 голосов
/ 26 августа 2011

Оператор using приведет к удалению вашего CurrentDataSource в конце блока using, а не к удалению DataService.Поэтому вопрос не в том, является ли DataService IDisposable (это не так), а в том, является ли MyEfModel одноразовым (это так).Как указывает г-н Разочарование, компилятор запретил бы использование оператора using, если бы это было не так.

Это означает, что блок using лучше всего использовать при создании нового объекта.Например:

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

Таким образом, вы не столкнетесь с возможностью того, что кто-то попытается получить доступ к CurrentDataSource после использования блока и обнаружит исключение.

Относительно вашего другого вопроса оIQueryable и тому подобное, я обычно не видел, чтобы методы WCF реализовывали IQueryable<>, так как они используются по сетевому соединению.Обычно IEnumerable<> является предпочтительным.И вы не «переводите» свой запрос в список, поскольку это будет означать, что он уже был в списке.Вы оцениваете запрос на создать Список.Тогда вы можете привести этого списка к IEnumerable или IQueryable , поскольку List реализует эти интерфейсы.

0 голосов
/ 19 октября 2011

Я закончил с этим:

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

Оператор using не требуется, поскольку служба данных WCF будет располагать CurrentDataSource в конце запроса. Использование IQueryable также позволяет использовать отложенную загрузку или отложенное выполнение.

Вот еще один пост на эту тему: Правильный способ возврата IQueryable с использованием службы данных WCF и EF

...