xeroxducati Ответов: 3

Получение уведомлений WCF в MVVM


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

Допустим, у меня есть простое консольное приложение, которое подключается к конечной точке WCF и отправляет текстовые сообщения по простому вызову SendMessage(string text).

Я хочу написать пользовательский интерфейс MVVM, который в основном визуализирует их по мере их поступления. Поэтому мое первоначальное мышление состоит в том, чтобы создать поток в ViewModel, который размещает службу WCF, каким-то образом ловит события из службы, обновляет свойство, а затем привязывается к уровню пользовательского интерфейса.

Поэтому я думаю, что мой вопрос таков: как мне это сделать? Чтобы быть более конкретным;
1. Является ли это модель или ViewModel, которая размещает службу WCF?
2. Как передать события из сервиса? Есть ли у меня служебные пожарные события?

Есть ли пример чего-то подобного, что я могу посмотреть где-то, что может иметь смысл? Клиент/сервер чата MVVM, который использует WCF или что-то в этом роде?

3 Ответов

Рейтинг:
2

xeroxducati

в этом меньше смысла..

ты предлагаешь:
клиент <--> WCF на IIS <--> MVVM UI

Это выполнимо, но требует IIS. Я хочу сделать то же самое, по сути, но разместить его через ServiceHost внутри самого приложения. т. е. приложение является хостом службы, так что клиенты подключаются к нему напрямую.


Рейтинг:
2

Abhinav S

xeroxducati писал:
Это модель, или модель представления, на котором размещена службы WCF?


Ни один из них не проводит службу. ИИС делает это.


Рейтинг:
0

mrMercury

Поскольку мне нужно было решить подобную головоломку, я дал ей немного, хотя и вот что я придумал: вы можете сделать это с привязкой вместо события, я бы использовал службу для получения сообщений, это отличается от вашей службы WCF, служба в MVVM-это класс, который делает что-то для ViewModel, таким образом, ViewModel не нужно знать, как сообщения попадают к нему, они просто делают, давайте посмотрим некоторый код:

служба WCF:

public class MessagesWFCService : IMessagesWFCService
    {
        public void SendMessage(string message)
        {
            MessageService.Instance.AddMessage(message);
        }
    }


Служба:
public interface IMessageService
    {
        void AddMessage(string message);
    }

    public class MessageService : IMessageService
    {        
        private static MessageService _Instance = null;
        
        private MessageViewModel _MessageViewModel = null;
        
        private ServiceHost _ServiceHost = null;
        public MessageService()
        {
            _Instance = this;
            _ServiceHost = new ServiceHost(typeof(MessagesWFCService));            
        }
        public void AddMessage(string message)
        {
            _MessageViewModel.Messages.Add(message);
        }
        public void Close()
        {
            _ServiceHost.Close();
        }
        public static MessageService Instance
        {
            get
            {
                return _Instance;
            }
            set
            {
                if(_Instance != value)
                    _Instance = value;
            }
        }
        public MessageViewModel MessageViewModel
        {
            get
            {
                return _MessageViewModel;
            }
            set
            {
                if(_MessageViewModel != value)
                    _MessageViewModel = value;
            }
        }
        public void Open()
        {
            _ServiceHost.Open();
        }
    }


модель представления
public class MessageViewModel : INotifyPropertyChanged
    {        
        public event PropertyChangedEventHandler PropertyChanged;

        private ObservableCollection<string> _Messages = null;
                
        private IMessageService _MessageService = null;

        public MessageViewModel()
        {
            _MessageService = new MessageService();
            _MessageService.MessageViewModel = this;
            _MessageService.Open();
        }
        public ObservableCollection<string> Messages
        {
            get
            {
                return _Messages;
            }
            set
            {
                if(_Messages != value)
                {
                    _Messages = value;
                    PropertyChangedEventHandler eventHandler = PropertyChanged;
                    if(eventHandler != null)
                        eventHandler(this, new PropertyChangedEventArgs("Messages"));
                }
            }
        }
    }


Конечно, вам нужно будет установить DataContext представления в ViewModel и привязать свойство ItemsSource элемента управления к свойству Messages ViewModel.

Если вы используете Призма или Единство вы должны использовать контейнер для разрешения Службы MessageService вместо непосредственного создания экземпляра.

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