2009-05-08 2 views
1

Я создаю интерфейс Silverlight для существующего настольного приложения, написанного с использованием CSLA. Единственное, что у меня возникают проблемы с является преобразование классов, как следующее:Как создать ленивую загруженную и кэшированную коллекцию в 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; 
    } 
} 

Код приправлены «SomeCollection.GetSomeCollection()» Это не будет работать на SilverLight стороне, потому что все DataPortal доступа асинхронный , поэтому вам нужно начать с примерно следующего:

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

Обработчик обратного вызова вызывается, когда данные готовы. Я могу, конечно, кэшировать результат этого, но в то же время любые вызовы SomeCollection.GetSomeCollection() будут терпеть неудачу.

Я пробовал блокировку до тех пор, пока асинхронный вызов не завершится, но до сих пор мне не повезло. Это не отличное решение, но я не знаю, что еще делать, если вызывается SomeCollection.GetSomeCollection() до того, как данные были загружены. единственный вариант, о котором я могу думать, это разрешить SomeCollection.GetSomeCollection() возвращать значение null, а затем каким-то образом преобразовать всех вызывающих абонентов для обработки нулевых значений возврата

Любые мысли?

(Я очень новичок в Silverlight и CSLA, так что вполне возможно, что я буду об этом совершенно неверном пути)

ответ