Шаблон для нескольких операций LoadOperations с использованием служб WCF RIA.

Я хотел бы иметь возможность загружать несколько наборов сущностей RIA за один вызов без объединения/вложения нескольких небольших операций LoadOperations вместе, чтобы они загружались последовательно.

У меня есть несколько страниц, на которых есть несколько выпадающих списков. Эти поля со списком заполняются статическими значениями из базы данных (например, значениями состояния).

Прямо сейчас я предварительно загружаю эти значения в свою виртуальную машину с помощью одного метода, который объединяет ряд операций LoadOperations для каждого типа, который я хочу загрузить. Например:

public void LoadEnums() {
        context.Load(context.GetMyStatusValues1Query()).Completed += (s, e) =>
        {
            this.StatusValues1 = context.StatusValues1;
            context.Load(context.GetMyStatusValues2()).Completed += (s1, e1) =>
            {
                this.StatusValues2 = context.StatusValues2;
                context.Load(context.GetMyStatusValues3Query()).Completed += (s2, e2) =>
                {
                    this.StatusValues3 = context.StatusValues3;

                     (....and so on)


                };
            };
        };
};

Хотя это работает нормально, это кажется немного неприятным. Кроме того, я хотел бы знать, когда завершается последняя операция загрузки, чтобы я мог загрузить любой объект, над которым я хочу работать после этого, чтобы эти перечисляемые значения правильно разрешались в элементах формы, таких как поля со списком и списки. (Я думаю) Я не могу сделать это легко, не создавая делегата и не вызывая его по завершении последней операции загрузки.

Итак, мой вопрос: кто-нибудь знает лучший шаблон для использования, в идеале, когда я могу загрузить все свои статические наборы сущностей в одну операцию LoadOperation?


person Dale    schedule 08.06.2010    source источник


Ответы (1)


Кажется, что ответ довольно прост, по крайней мере, в сервисах RIA 1.0:

Просто вызовите LoadOperations одну за другой, и контекст домена сделает их синхронно в том порядке, в котором они вызываются.

i.e.

context.Load(context.GetMyStatusValues1Query()).Completed += (s, e) =>
  {
    this.StatusValues1 = context.StatusValues1;
  }

context.Load(context.GetMyStatusValues2Query()).Completed += (s1, e1) =>
  {
    this.StatusValues1 = context.StatusValues2;
  }

Это не кажется мне очевидным, потому что я ожидал, что второй запрос будет вызван сразу после первого, пока он еще загружается, и выдаст исключение «LoadOperation in progress».

Это здорово, потому что это означает, что единственная причина для использования уродливого вложенного шаблона LoadOperation в примере в моем вопросе — это когда вторая LoadOperation зависит от результата первой.

person Dale    schedule 30.10.2010
comment
Есть ли способ вызвать context.Load синхронно? - person Shimmy Weitzhandler; 12.02.2012
comment
@Shimmy, все вызовы служб RIA в Silverlight являются асинхронными. - person Custodio; 17.08.2012
comment
Custodio, мой вопрос заключался в том, могу ли я вызвать его синхронно и заблокировать текущий поток. - person Shimmy Weitzhandler; 17.08.2012