1

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に非常に慣れていないので、これを完全に間違った方法で行っている可能性があります)

4

1 に答える 1

1

http://forums.lhotka.net/forums/thread/35585.aspx

于 2009-10-12T18:03:25.580 に答える