CSLAを使用して作成された既存のデスクトップアプリケーション用のSilverlightフロントエンドを作成しています。私はとのトラブルを抱えていることの一つ次のようなクラスに変換されます。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)」すべてDataPortalアクセスがasyncronousあるので、これは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にスーパー新たなんだ、それは私がこのことについて完全に間違った道を進んだことも可能です)