Переосмысление опыта разработки собственного мессенджера на основе Lync SDK (Skype for Business)
Идея
В нашей компании для коммуникации сотрудников в качестве корпоративной связи используется Lync сервер и Skype for Business клиенты. Они имеют свои достоинства и недостатки (например, проблемы с сохранением истории переписки), но сегодня не об этом.У нас уже была идея создания собственного клиента на основе Lync SDK, который полностью бы заменил клиент Skype for Business. Мы потратили много времени и сил, создали свой мессенджер, который покрывает все неудобства и дополняет функционал Lync, но несколько «ШоуСтопперов» так и не смогли побороть. Также оптимизма не добавляло и немалое количество багов в самом Lync SDK.Главное, что мы получили в процессе создания собственного клиента – это огромный опыт использовании технологии и знания, которые являются, по сути, уникальными. Поэтому мы решили не останавливаться и создать несколько отдельных приложений для Skype for Business, каждое из которых должно решать только какую-то одну крупную задачу, в отличие от предыдущего проекта, который являлся приложением «всё в одном». Так родились две идеи – это приложение для управления контактами, речь про которое пойдет в данной статье, и приложение для сохранения истории сообщений, о котором расскажем отдельно.Стек технологий, архитектура, разработка
Приложение разрабатывалось с использованием технологий .NET Framework 4.6.1, Unity Framework, Prism.Одним из недостатков в разработке предыдущего приложения было использование Lync SDK по всему коду, что сильно мешало внедрению новых возможностей и модульности приложения. Поэтому главный вывод, который мы сделали — это независимость от сторонних решений. Все интеграционные зависимости обязаны быть абстрагированы, и наше решение должно пользоваться абстракциями вместо конкретных библиотек и фреймворков.Если смотреть на компонентную диаграмму архитектурного решения, то можно выделить три группы компонентов.
— Сторонние компоненты, не принадлежащие нам (Lync Client SDK);
— служебные компоненты, реализующие логику соединения и развязки слоев (MSConnector, IConnector, CommonDTO, AppModel);
— прикладные компоненты, представляющие собой клиентские приложения.
Если с первой и третьей группой все более-менее понятно, то на второй следует остановиться более подробно.
AppModel – модель предметной области. Она представляет собой чистую объектную модель, которая описывает данную предметную область.
Главная ее особенность — это то, что она не содержит никаких ссылок на сторонние библиотеки (например, Lync и Outlook).Для связи с низлежащим уровнем модель использует интерфейс IConnector, который закрывает собой конкретную реализацию и всю черновую работу по соединению с транспортными и служебными библиотеками.
Этот интерфейс удобно рассматривать как общий, — при разработке он был разделен на функциональные части (ICommunication, ICalendar, ITask и т.п.)Одним из вариантов реализации этого интерфейса является MSConnector, который умеет общаться к Lync Client SDK и Outlook, а также обслуживать запросы, приходящие в рамках интерфейса.
Для того, чтобы модель и коннектор могли поддерживать эффективное взаимодействие, в системе выделен компонент CommonDTO, в котором описаны все общие классы, необходимые для обмена данными.Клиентские приложения взаимодействуют с моделью предметной области напрямую, вызывая ее объекты и подписываясь на ее события.
По сути, в данной архитектуре модель является кэширующим прокси для внешних сервисов.Таким образом, мы обеспечили развязку приложения от Lync (Skype for Business) и Outlook, и пришли к тому, что в рамках этой архитектуры мы потенциально можем перейти на другие сервисы.
Например, использовать Telegram или обычный Skype в качестве мессенджера и Google Apps как почтовое приложение и календарь.
На основе этого решения, мы создали библиотеки-прослойки между Lync и нашим приложением и приступили к разработке непосредственно клиентской части.Суть приложения заключается в расширенном управлении своими контактами Lync.
Из главных возможностей можно выделить следующие:
• создание контактов (одиночных либо множественных);
• создание групп;
• поиск по Lync и адресной книге Outlook;• просмотр собственного календаря.
При этом каждый контакт обладает расширенным списком возможностей:
• Открытие диалога с контактом (с возможностью отправки коротких сообщений);
• Звонок на Lync, на любой телефон из из списка телефонов контакта, видео-звонок;• Просмотр календаря контакта;
• Оповещения об изменениях статуса контакта на «Онлайн» с запоминанием сообщения;
• Изменение действия по умолчания при нажатии на контакт (звонок, видео-звонок, либо открытие чата);
• Отправка e-mail с пустым либо предустановленным заголовком;
• Планирование собрания с контактом;• Поиск всех писем от контакта;
• Просмотр карточки контакта (с отображением всего календаря пользователя).
Из дополнительных возможностей приложения можно выделить:
• Drag&Drop контактов между группами, из окна поиска;
• Масштабирование контактов всех групп разом, так и групп контактов по отдельности;
• Добавление ярлыков файлов, либо приложений на таскбар программы;
• Изменение собственного статуса в Skype for Business.
Публикация в Windows Store
Было принято решение, что приложение должно распространяться в двух видах – обычный инсталлятор (exe или msi, через сайт) и через магазин Microsoft в виде appx пакета.
Уже имея опыт конвертирования классических приложений в appx пакет на прошлом приложении, в этом случае мы пошли по тому же пути, но двигались гораздо быстрее.
Единственное, что мы добавили по сравнению с публикацией предыдущего приложения — это мультиязычность.
Сейчас приложение доступно для пользователей на трех языках – русском, английском и немецком.
Чтобы в магазине Microsoft увидеть список поддерживаемых приложением языков надо немного поправить AppxManifest.xml, в нашем случае он выглядит так:
Заключение
В результате сейчас мы получили, как и само приложение для управления контактами, которое не повторяет функционал Lync, а расширяет его и работает с ним в паре, так и набор необходимых библиотек для «быстрого» воплощения дальнейших наших идей. Буду рад обратной связи в комментариях, благодарен за идеи.
Вячеслав Нестеров, ведущий разработчик приложения.