Lars och jag satt och pratade om möjligheten att göra service anropen i silverlight enklare.
Inte för att det i sig är speciellt svårt, men min erfarenhet är att koden gärna blir lite grötig efter ett tag.
En inte alltför ovanlig syn i mina projekt är något i stil med det här:
private void SetEventHandlers()
{
ServiceClient.GetABunchOfIntsCompleted += new EventHandler<GetABu....
ServiceClient.GetCitiesCompleted += new EventHandler<GetCitiesCom....
ServiceClient.GetUserInfoCompleted += new EventHandler<GetUserInf....
ServiceClient.GetUserInfoListCompleted += new EventHandler<GetUse....
}
private void LoadMyBaseData()
{
ServiceClient.GetABunchOfIntsAsync(25);
ServiceClient.GetCitiesAsync();
ServiceClient.GetUserInfoAsync("Andreas", "Paulsson");
ServiceClient.GetUserInfoListAsync();
}
void ServiceClient_GetUserInfoListCompleted(object sender, GetUserInfoListCompletedEventArgs e)
{
//Do something intelligent
}
void ServiceClient_GetCitiesCompleted(object sender, GetCitiesCompletedEventArgs e)
{
//Do something intelligent
}
void ServiceClient_GetABunchOfIntsCompleted(object sender, GetABunchOfIntsCompletedEventArgs e)
{
//Do something intelligent
}
void ServiceClient_GetUserInfoCompleted(object sender, GetUserInfoCompletedEventArgs e)
{
//Do something intelligent
}
Vi började diskutera möjligheten att skapa en klass som helt enkelt löser anropen åt oss och som kan meddela när jag
fått det data som jag behöver för att applikationen ska kunna fungera.
Lösningen blev ett recept med instruktioner.
Bifogat finns en zipfil med exempelkod att ladda hem.
Det man gör är att skapa en ny instans av Recipe klassen med en ny instans av service klienten i konstruktorn. Skapa ett
event för onLoaded och börja fylla på listan med instruktioner.
Anropa StartLoad och vänta.
Med det här angreppet kan jag skriva kod som ser ut mer såhär:
private void LoadData()
{
MyBaseRecipe = new Recipe(ServiceClient, "BaseRecipe");
MyBaseRecipe.onLoaded += new EventHandler(MyBaseRecipe_onLoaded);
MyBaseRecipe.AddInstruction("GetCitiesAsync", new List<string>(), new List<object>());
MyBaseRecipe.AddInstruction("GetABunchOfIntsAsync", new List<int>(), new List<object>() { 25 });
MyBaseRecipe.AddInstruction("GetUserInfoAsync", new UserInfo(), new List<object>() { "Andreas", "Paulsson" });
MyBaseRecipe.AddInstruction("GetUserInfoListAsync", new List<UserInfo>(), new List<object>());
MyBaseRecipe.StartLoad();
}
På det här viset kan jag “släcka ner” applikationen under laddning på ett snyggare sätt utan att behöva använda fulflaggor osv.
Ha en fortsatt bra dag!
/Andreas
SilverlightAsyncCallerHandler.zip (678,58 kb)