MessengerClientクラスにはLogin関数があります。MessengerClientクラスには、LoggedInイベントとIsLoggedInプロパティがあります。
MessengerClientクラスでLoginが呼び出されると、連絡先リスト/名簿がソケットを介してリモート サーバーから取得され、処理されます。その後、クライアントはログインしていると見なされ、IsLoggedInは true を返します。LoggedInイベントは、この後に Login 関数内で発生します (したがって、ログインを要求する同じスレッド内で発生します。これは悪いことではないと思います)。
ログインすると、クライアントはリモート サーバーからライブ更新を受信します。
ログイン中に連絡先リスト/名簿を処理する場合、エンド ユーザーにとって理想的な設計は、クライアントがログインしていると見なされる前に、すべての連絡先リスト/名簿データを処理することだと思います。このようにして、ユーザーがLoggedInイベントを受け取ると、すぐに連絡先データにアクセスできます。
例えば -
ここには、LoggedInイベントに対するエンド ユーザーのハンドラーがあります。
void MsgrLoggedIn(object sender, EventArgs a)
{
_msgr.Contacts.Contains("billy@bob.com"); //returns true
}
クライアントがログイン済みとしてマークされる前、およびLoggedInイベントが発生する前に、すべての連絡先リストが処理されているため、上記のステートメントは true を返します。論理的には、連絡先リストのダウンロードと処理はログイン操作の一部であるため、これはエンド ユーザーが期待することだと思います。
また、連絡先が連絡先リストに追加されたとき、またはグループに追加されたときにイベントを発生させることも好きです。これまでに述べたロジックからすると、データが処理されているときにContactAdded、ContactAddedToGroupなどのイベントを発生させることは明らかに意味がありません。これにより、MessengerClient クラスが処理される前にエンド ユーザーがこれらのイベントのいずれかを受け取ることになるためです。ログイン中としてマークされます。
void MsgrContactAdded(object sender, ContactEventArgs e)
{
_msgr.SendMessage(e.Contact, "hello there"); // throws NotLoggedInException
}
上に示したように、これは悪いことが起こる結果になります。
したがって、私が実際に行う必要があるのは、連絡先リストのデータを処理し、logged in イベントを発生させ、その後で他のすべての連絡先イベントを発生させることです。
このために、すべての連絡先オブジェクト、グループ オブジェクトなどを反復処理して、適切なイベントを発生させることができます。
ここまでは大丈夫ですよね?
ただし、問題は、最初のログイン時に連絡先リストのデータをダウンロードすることに加えて、クライアントがログアウトしてから再度ログインした場合に連絡先データを同期する準備をしなければならないことです。
これには、ContactRemoved、ContactNameChanged、ContactRemovedFromGroup などのイベントが含まれます。
そのため、削除された連絡先やプロパティが変更された連絡先を考慮する必要があるため、連絡先やグループなどを反復処理するほど単純ではなくなりました。
したがって、ログインが行われた後にこれらのイベントが発生するように「キューに入れる」別の方法が必要です。
各同期イベントを表すクラスを用意することを検討しました。たとえば、SyncContactRemoved、SyncContactNameChanged、SyncContactAddedToGroup などです。これにより、データを処理し、イベントごとに Sync*XXX* クラスを作成し、それらをリストに追加して、ログイン後に反復できるようにします。
オブジェクト自体にメソッドを持たせることも検討しました。つまり、Group.SyncContactsAdded、Contact.SyncNameChanged、MessengerClient.SyncContactsAdded です。次に、ログイン後に連絡先/グループなどを繰り返し処理し、これらのプロパティを確認し、必要に応じてイベントを発生させてからクリアします。
最後に、EventHandler と EventArgs を含む Event クラスを持つことを検討しました。この方法でイベントをキューに入れ、ログイン後に 1 つずつ呼び出すことができます。
もしあれば、これらのパターンのどれがより一般的な方法と考えられますか. または、これを達成するための代替手段はありますか?
とても長い質問で申し訳ありませんが、簡単な質問ではありません。
ありがとう