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