Каков наилучший способ сохранить кэшированные данные для совместного использования в разных приложениях WPF на одном компьютере? - PullRequest
1 голос
/ 30 января 2009

Я думаю о хранении данных в наборе данных в размещенной службе WCF, и другие приложения (в том же окне) могут получать доступ к данным через именованные каналы (предоставляемые через службу WCF). Затем приложения сохраняют внутри себя копию dataSet, чтобы не повторно получать данные из WCF, если они не были изменены.

Данные извлекаются с сервера в виде коллекции данных, поэтому я записываю их как DataTables и сохраняю как Dataset.

Данные редко меняются, но когда это происходит, я должен информировать все клиентские приложения, которые получили данные, для обновления.

Ответы [ 2 ]

0 голосов
/ 01 февраля 2009

Я делаю что-то похожее с приложением, которое написал.

Вы можете легко позволить службе обновлять клиентов при изменении данных с помощью обратного вызова. Когда клиенты подключаются к сервису, вам нужно будет сохранить их информацию обратного вызова, а когда данные обновляются, вы просто запускаете сообщение для каждого подписавшегося клиента.

Вот контракт на обратный звонок:

public interface IServiceMessageCallback
{

    [OperationContract(IsOneWay = true)]
    void OnReceivedServiceMessage(ServiceMessage serviceMessage);
}

Служба реализует этот интерфейс. Служба имеет это личное поле:

    /// <summary>
    /// Holds the callback recipients
    /// </summary>
    private List<IServiceMessageCallback> callbackMessages = 
              new List<IServiceMessageCallback>();

Когда клиенты подключаются, сделайте что-то вроде этого:

    IServiceMessageCallback callback = 
       OperationContext.Current.GetCallbackChannel<IServiceMessageCallback>();
    callbackMessages.Add(callback);

И, наконец, любой метод обновления данных в службе также должен иметь такой код:

    Action<IServiceMessageCallback> fire =
         delegate(IServiceMessageCallback callback)
             { callback.OnReceivedServiceMessage(serviceMessage); };

    // loop thru the callback channels and perform the action
    callbackMessages.ForEach(fire);

Я как бы исправил этот код вместе с довольно здоровенным сервисом, который я написал ... надеюсь, что части имеют смысл вне контекста.

0 голосов
/ 30 января 2009

Ваше решение будет работать. Если у вас есть доступ к надлежащей службе кэширования, такой как ScaleOut StateServer, Velocity или memcached, вы можете использовать ее для своих нужд. Он будет делать то же самое, но вы получите проверенное решение с дополнительными функциями, связанными с управлением кэшем, а также возможностью масштабирования до более чем одной машины в случае необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...