Мы продолжаем делать продукты на базе (и для) 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.
Было принято решение, что приложение должно распространяться в двух видах – обычный инсталлятор (exe или msi, через сайт) и через магазин Microsoft в виде appx пакета.
Имея опыт конвертирования классических приложений в appx пакет на прошлом приложении, в этом случае мы пошли по тому же пути, но двигались гораздо быстрее.
Единственное, что мы добавили по сравнению с публикацией предыдущего приложения — это мультиязычность. Сейчас приложение доступно для пользователей на трех языках – русском, английском и немецком. Чтобы в магазине Microsoft увидеть список поддерживаемых приложением языков надо немного поправить AppxManifest.xml, в нашем случае он выглядит так:
В результате сейчас мы получили, как и само приложение для управления контактами, которое не повторяет функционал Lync, а расширяет его и работает с ним в паре, так и набор необходимых библиотек для «быстрого» воплощения дальнейших наших идей.
Буду рад обратной связи в комментариях, благодарен за идеи.
Вячеслав Нестеров
Идея
В нашей компании для коммуникации сотрудников в качестве корпоративной связи используется 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, в нашем случае он выглядит так:
<Resources>
<Resource Language="de-DE" />
<Resource Language="ru-RU" />
<Resource Language="en-us" />
<Resource uap:Scale="100" />
<Resource uap:Scale="125" />
<Resource uap:Scale="150" />
<Resource uap:Scale="200" />
<Resource uap:Scale="400" />
</Resources>
Заключение
В результате сейчас мы получили, как и само приложение для управления контактами, которое не повторяет функционал Lync, а расширяет его и работает с ним в паре, так и набор необходимых библиотек для «быстрого» воплощения дальнейших наших идей.
Буду рад обратной связи в комментариях, благодарен за идеи.
Вячеслав Нестеров
Поделиться с друзьями