CSLAを使用して作成された既存のデスクトップアプリ用にSilverlightフロントエンドを作成しています。私が問題を抱えていることの1つは、次のようなクラスの変換です。
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()」が追加されています。これは、すべてのDataPortalアクセスが非同期であるため、Silverlight側では機能しません。したがって、次のようなものから始める必要があります。
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を返すことを許可し、次にすべての呼び出し元をnullの戻り値を処理するように変換することです。
何かご意見は?
(私はSilverlightとCslaに非常に慣れていないので、これを完全に間違った方法で行っている可能性があります)