SignalRを使用してC#ベースのWebアプリケーションを作成しています。これまでのところ、「ロビー」エリア(オープンなコミュニケーションが許可されている)と「セッション」エリア(5人のグループがプライベートな会話を行うことができ、サーバーの相互作用はグループにのみ表示されます)があります。
私がやりたいのは、メモリ内に「ロギング」オブジェクトを作成することです。セッションごとに1つです(したがって、5人のグループが3つある場合、ロギングオブジェクトは3つになります)。
'session'領域はHubs
(およびIDisconnect
)を継承し、いくつかのメソッド(Join、Send、Disconnectなど)があります。メソッドは、クライアント側のJS関数を呼び出すJavaScriptクライアントにデータを返します。コンストラクターメソッドを使用してみました:
public class Session : Hub, IDisconnect
{
public class Logger
{
public List<Tuple<string, string, DateTime>> Log;
public List<Tuple<string, string, DateTime>> AddEvent(string evt, string msg, DateTime time)
{
if (Log == null)
{
Log = new List<Tuple<string, string, DateTime>>();
}
Log.Add(new Tuple<string, string, DateTime>(evt, msg, time));
return Log;
}
}
public Logger eventLog = new Logger();
public Session()
{
eventLog = new Logger();
eventLog.AddEvent("LOGGER INITIALIZED", "Logging started", DateTime.Now);
}
public Task Join(string group)
{
eventLog.AddEvent("CONNECT", "User connect", DateTime.Now);
return Groups.Add(Context.ConnectionId, group);
}
public Task Send(string group, string message)
{
eventLog.AddEvent("CHAT", "Message Sent", DateTime.Now);
return Clients[group].addMessage(message);
}
public Task Interact(string group, string payload)
{
// deserialise the data
// pass the data to the worker
// broadcast the interaction to everyone in the group
eventLog.AddEvent("INTERACTION", "User interacted", DateTime.Now);
return Clients[group].interactionMade(payload);
}
public Task Disconnect()
{
// grab someone from the lobby?
eventLog.AddEvent("DISCONNECT","User disconnect",DateTime.Now);
return Clients.leave(Context.ConnectionId);
}
}
ただし、これにより、ユーザーがサーバーと対話するたびにロガーが再作成されます。
新しいセッションごとに1つのロガーを作成し、それに要素を追加する方法を知っている人はいますか?または、これを行うためのより簡単な方法があり、私は問題を考えすぎていますか?