views:

56

answers:

1

Hi,

I need to use a WCF API to save data into a DB. Ordinarily, I'd use chaining, like the example below:

 IClientBroker clientBroker = UIContext.CreateWcfInterface<IClientBroker>("Data/ClientBroker.svc");
 clientBroker.BeginSetClientBusinessName(_client.ID, businessName, (result) =>
  {
   _client = ((IClientBroker)result.AsyncState).EndSetClientBusinessName(result);

     clientBroker.BeginSetClientAddress(_client.ID, addressObservableCollection, postcodeZip, (result2) =>
    {
     _client = ((IClientBroker)result2.AsyncState).EndSetClientAddress(result2);

       clientBroker.BeginSetClientTelephone(_client.ID, telephone, (result3) =>
      {
       _client = ((IClientBroker)result3.AsyncState).EndSetClientTelephone(result3);

         clientBroker.BeginSetClientFax(_client.ID, fax, (result4) =>
        {
           _client = ((IClientBroker)result4.AsyncState).EndSetClientFax(result4);

           if (customFields.Save(validationSummaryBridge))
           {
            CloseWindow(true, "ClientID=" + _client.ID.ToString());
           }
           else
           {
            validationSummary.Errors.Add(new ValidationSummaryItem("Failed to save Custom Fields"));
           }
        }, clientBroker);
      }, clientBroker);
    }, clientBroker);
  }, clientBroker);
}

This gives me faux-synchronous behaviour which I need so exceptions are thrown in a timely fashion and I can react on validation events.

This doesn't map well, however, when I have a loop of fields to save. For example, what pattern would be best to save the following list of "Custom Fields", where each Custom Field must be saved using a single WCF call?

 ICustomFieldsBroker customFieldsBroker = UIContext.CreateWcfInterface<ICustomFieldsBroker>("Data/CustomFieldsBroker.svc");
 foreach (CustomField customField in _customFields)
 { 
  string newValue=_customFieldControlDictionary[customField].CustomField.Value;
    customFieldsBroker.BeginSetCustomFieldValueForItem(DataTypeID, DataItemID, customField.Key, newValue, (result) =>
   {
      ((ICustomFieldsBroker)result.AsyncState).EndSetCustomFieldValueForItem(result);
   }, customFieldsBroker);
 }

In the above example, this would just set off, say, 5 requests to the WCF API/threads which would potentially return AFTER the form has closed. I need them to "line up", so I can list their status and return to the form.

Thanks very much.

Don't let the WCF distract you, but if you have any comments, do let me know. :)