我正在使用SignalR编写基于 C# 的 Web 应用程序。到目前为止,我有一个“大厅”区域(允许公开交流)和一个“会话”区域(5 人一组可以进行私人对话,并且任何服务器交互只显示给该组)。
我想做的是在内存中创建一个“日志记录”对象——每个会话一个(所以如果有三组,每组五个人,我会有三个日志记录对象)。
“会话”区域继承自Hubs
(and 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);
}
}
但这会导致每次用户与服务器交互时都会重新创建 Logger。
有谁知道我如何能够为每个新会话创建一个 Logger 并向其中添加元素?还是有更简单的方法可以做到这一点,而我只是想多了这个问题?