2009-05-08 7 views
1

Je crée un frontal Silverlight pour une application de bureau existante écrite à l'aide de CSLA. Une chose que je vais avoir du mal à se convertissait des classes comme les suivantes:Comment créer une collection paresseuse et mise en cache dans Silverlight/CSLA

public class SomeCollection : Csla.ReadOnlyListBase<SomeCollection, SomeObject> 
{ 
    private static SomeCollection _list = null; 
    public static SomeCollection GetSomeCollection() 
    { 
     if (_list == null) 
     { 
      _list = DataPortal.FetchChild<SomeCollection>(); 
     } 
     return _list; 
    } 
} 

Le code est truffé de « SomeCollection.GetSomeCollection() » Cela ne fonctionnera pas sur le côté silverlight parce que tous les accès DataPortal est asyncronous , donc vous devez commencer avec quelque chose comme ce qui suit:

public static void GetSomeCollection(EventHandler<DataPortalResult<SomeCollection>> callback) 
{ 
    DataPortal<SomeCollection> portal = new DataPortal<SomeCollection>(); 
    portal.FetchCompleted += callback; 
    portal.BeginFetch(); 
} 

Le gestionnaire de rappel est appelé lorsque les données sont prêtes. Je peux certainement mettre en cache le résultat de ceci, mais en attendant tous les appels SomeCollection.GetSomeCollection() échoueront.

J'ai essayé de bloquer jusqu'à la fin de l'appel asynchrone, mais je n'ai pas eu de chance jusqu'à maintenant. Ce n'est pas une bonne solution, mais je ne sais pas quoi faire d'autre si SomeCollection.GetSomeCollection() est appelée avant le chargement des données. la seule autre option que je peux penser est de permettre à SomeCollection.GetSomeCollection() de retourner null, et ensuite convertir d'une manière ou d'une autre tous les appelants pour manipuler des valeurs de retour nul

Des pensées?

(je suis super nouveau pour Silverlight et AAPC, il est donc possible que je vais sur ce la façon complètement faux)

Répondre

Questions connexes