我使用Caliburn.Micro构建Windows 8.1 Universal应用程序。该应用程序使用WebSocket连接到Web服务。我希望这个连接一旦建立,只要应用程序处于活动状态,就可以保持活动状态,无论用户在哪个页面上。
目前我这样做:
container = new WinRTContainer();
container.Singleton<IConnectionService, ConnectionService>();
它似乎按我的意愿工作。我可以在我的viewmodels中注入它,并且连接仍然是打开的,即使没有注入服务的视图模型处于活动状态,它也会接收消息。然而,如果这是正确的方式(如果它实际上正在做我期待的事情),我有点好奇吗?
其次,我使用连接管理器解析从WebSocket连接返回的JSON,并创建相应的类,如RandomThingHappened
,并使用Caliburn.Micro中的事件聚合器服务广播这些类。对这些感兴趣的观点可以订阅并做他们想要的。但是,无论用户在哪个视图上,都有一些我想要处理的消息。这可能吗?我也考虑过为此创建单例,并确保在某处实例化这些单例。然而,这似乎有点......冒险。
建议?
答案 0 :(得分:1)
不确定websocket但是
我正在使用以下方式进行My WCF服务(必须始终连接哑终端,因为WCF服务将使用回调将消息推送到已连接的终端
[OperationContract(IsOneWay = true)]
void KeepConnection();
并在您的客户端使用计时器来继续调用服务
var timer = new DispatcherTimer { Interval = new TimeSpan(0, 0, 50) };
timer.Start();
timer.Tick += (sender, args) =>
{
try
{
if (this.client.State == CommunicationState.Faulted)
{
this.RegisterTerminal();
}
this.client.KeepConnection();
}
catch
{
throw new Exception("Failed to establish connection with server");
}
};
对于广播,您可以使用EventAggregator将您的活动发布到所有听力课程。
你可以在这里阅读更多Event Aggregator