Я использую Caliburn.Micro для создания универсального приложения Windows 8.1. Приложение подключается к веб-службе с помощью WebSocket. Я хотел бы, чтобы эта связь была создана после того, как она была сохранена до тех пор, пока приложение активно, независимо от того, на какой странице пользователь включен.
В настоящее время я делаю это так:
container = new WinRTContainer();
container.Singleton<IConnectionService, ConnectionService>();
и, похоже, он работает так, как я хочу. Я могу ввести его в мои модели просмотра, и соединение все еще открыто и оно получает сообщения, даже если модель представления, которая не вводит услугу, активна. Мне, однако, немного любопытно, если это правильный способ (и если он действительно делает то, что я ожидаю)?
Во-вторых, я использую диспетчер соединений для анализа JSON, возвращаемого из соединения WebSocket, и создания соответствующих классов, таких как RandomThingHappened
и их трансляции с использованием службы агрегатора событий от Caliburn.Micro. Заинтересованные в них могут подписаться и сделать то, что они хотят. Тем не менее, есть некоторые сообщения, которые я хотел бы обрабатывать независимо от того, с каким видом пользователь включен. Это возможно? Я думал о создании синглов для этого, а также просто удостоверяюсь, что они где-то создаются. Это, однако, кажется немного... рискованным.
Предложения?
Не совсем уверен в websocket, но
Я использую следующие способы для моей службы 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