Я создаю интерфейс 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, так что вполне возможно, что я буду об этом совершенно неверном пути)