Я пишу веб-приложение на C#, используя SignalR. На данный момент у меня есть зона «лобби» (где разрешено открытое общение) и зона «сеанса» (где группы из 5 человек могут вести приватный разговор, а любые взаимодействия с сервером видны только группе).
Что я хотел бы сделать, так это создать в памяти объект «логирования» - по одному для каждого сеанса (так что, если есть три группы по пять человек, у меня будет три объекта логирования).
Область «сессия» наследуется от Hubs
(и IDisconnect
) и имеет несколько методов (Join, Send, Disconnect и т. д.). Методы передают данные обратно клиенту JavaScript, который вызывает клиентские функции JS. Я пробовал использовать метод конструктора:
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);
}
}
Но это приводит к тому, что Logger воссоздается каждый раз, когда пользователь взаимодействует с сервером.
Кто-нибудь знает, как я смогу создать один Logger для каждого нового сеанса и добавить к нему элементы? Или есть более простой способ сделать это, и я просто слишком много думаю о проблеме?