0

C# と MonoTouch を使用して Web サービス用のクライアント アプリを作成しています。ユーザー セッション (登録、ログイン、ログアウト)、メッセージング (リスト、書き込み、削除など)、イメージ ルーチン (アップロード、ダウンロード) などのコマンドがいくつかあります。

次のように、非同期で実行できるユーザー セッション リクエスト タイプの実装を作成しました。

{
    public delegate void LoginEventHandler(Session session);
    public delegate void ErrorEventHandler(Error error);
    public delegate void StatusEventHandler(string status);

        public interface IDataProvider
        {
            #region Session
            Session GetSession();

            event LoginEventHandler OnRegistered;
            event ErrorEventHandler OnRegisteredError;
            void Register(Person user);

            event LoginEventHandler OnLoggedIn;
            event ErrorEventHandler OnLoggedInError;
            void Login(Person user);

            event StatusEventHandler OnLoggedOut;
            event ErrorEventHandler OnLoggedOutError;
            void Logout(Session session);
            #endregion
        }
    }
}

それは機能しますが、今でも2つのイベントハンドラーを実装して、後でリクエストに対してサブスクライブを解除するのは少し退屈で弱いです:

dataProvider = new DataProviderService ();
...
appDelegate.dataProvider.OnRegistered += HandleOnRegistered;
appDelegate.dataProvider.OnRegisteredError += HandleOnRegisteredError;
appDelegate.dataProvider.Register(GetPerson());
...
void HandleOnRegistered (Session session)
{
    InvokeOnMainThread(delegate {
        appDelegate.settings.Session = session;

        appDelegate.dataProvider.OnRegistered -= HandleOnRegistered;
        appDelegate.dataProvider.OnRegisteredError -= HandleOnRegisteredError;

        Waiter.HideWaiter();
        Console.WriteLine(session.userId);
    }
    );
}

void HandleOnRegisteredError (Error error)
{
    InvokeOnMainThread(delegate {
        appDelegate.dataProvider.OnRegistered -= HandleOnRegistered;
        appDelegate.dataProvider.OnRegisteredError -= HandleOnRegisteredError;

        Console.WriteLine(error);
    });
}    

さらなる開発のためにアーキテクチャを改善するための提案はありますか? または、教祖が通常どのように行うかを確認するための資料はありますか?

4

1 に答える 1

1

一般的に、この種のものを設計する方法は次のとおりです。

  • コントローラーを遅延ロードする
  • 各コントローラーはアプリ内のシングルトンであり、アプリケーションの存続期間中にとどまります (私は IoC コンテナーを使用しますが、そうする必要はありません)。
  • WCF サービス (ま​​たはチャネル) もシングルトンにする
  • 各コントローラーのコンストラクターで、このようなイベントをサブスクライブします
  • メモリ不足の状態でほとんどのメモリを解放できるように、適切に処理ViewDidLoadします。ViewDidUnload
  • イベントの可視性などを確認IsViewLoadedして、イベントを処理する必要があるかどうかを判断します

適切な方法で購読を解除できますが、必須でDisposeはありません。

于 2012-07-13T16:38:53.637 に答える