Я не могу добавить ссылку на ServiceModel в проект переносимой библиотеки

Я тестирую приложение UWP и хочу использовать прокси для использования службы WCF. У меня есть прокси, который является библиотекой для.net 4.6, но я не могу добавить этот проект в качестве ссылки в проекте универсального приложения. Это нормально, потому что это библиотека для.net 4.6.

Поэтому я пытаюсь создать переносную библиотеку, и у меня есть два варианта, чтобы создать переносную библиотеку. Эта опция позволяет мне сказать, какие цели я могу использовать. Я выбираю.net 4.6 и Windows Universal 10.0. Проблема в том, что я не могу добавить ссылку на System.ServiceModel что мне нужно использовать прокси.

Другим вариантом является портативная библиотека для Windows Universal. В этом случае я не могу выбрать целевые проекты, это имеет смысл, потому что это только для универсальных приложений. В этом случае я могу добавить ссылку на System.ServiceModel,

Я знаю, что в переносимой библиотеке я могу использовать только более ограниченные библиотеки целевого проекта, в этом случае я предполагаю, что это windows универсальный, нет.net 4.6. Но тогда почему я могу добавить ссылку в переносимую библиотеку для универсальных приложений, а не в переносимую библиотеку, в которой я использую.net?

Я хотел бы иметь универсальную переносимую библиотеку, чтобы иметь возможность использовать прокси в приложениях WPF и универсальных приложениях Windows.

Благодарю.

1 ответ

Решение

К сожалению, между различными целевыми структурами нет простого подмножества; т. е. в вашем случае UWP не является подмножеством.NET 4.6, поэтому, когда вы создаете переносимую библиотеку классов, ориентированную на оба, у вас не просто доступны все API-интерфейсы из меньшей платформы.

При работе с клиентом System.ServiceModel В коде ситуация еще более запутанная: хотя обе целевые платформы включают базовую поддержку прокси-серверов WCF, API-интерфейсы достаточно различны, так что не существует переносимого эквивалента, который был бы доступен при создании PCL. Это причина поведения, которое вы видите: вы можете создать прокси как в библиотеке классов.NET 4.6, так и в библиотеке классов UWP, но вы не можете создать его в переносимой библиотеке классов, предназначенной для них обоих. Вам нужно будет создать 2 отдельные библиотеки.

Если вы собираетесь называть прокси из WPF для конкретной платформы кодом UWP, то это не должно быть проблемой, но я подозреваю, что вы хотели бы вызывать их из кода бизнес-логики, который вы бы предпочли реализовать в портативной библиотеке классов.

Вы можете достичь этого следующим образом:

  • Создайте интерфейс для прокси-класса в общей переносимой библиотеке классов для UWP и.NET 4.6.
  • Ссылка на эту общую библиотеку из обеих платформенно-зависимых библиотек классов: UWP и.NET 4.6. Прокси-серверы в этих 2 библиотеках должны реализовывать общий переносимый интерфейс. Я не пробовал, но если вы сконфигурируете ссылки на сервисы для повторного использования типов из вашей переносимой библиотеки классов, сгенерированные прокси уже должны реализовывать ваши интерфейсы. Таким образом, вы можете избежать создания оберток вокруг ваших прокси в каждой из библиотек классов для конкретной платформы.
  • Теперь вы можете писать бизнес-логику в общей переносимой библиотеке классов и работать только с прокси-серверами, используя общий интерфейс. Чтобы получить конкретные экземпляры этого интерфейса на каждой платформе, используйте переносимую структуру внедрения зависимостей, такую ​​как Ninject.
  • В коде приложения для каждой платформы вы затем инициализируете структуру внедрения зависимостей, регистрируя правильную прокси-реализацию интерфейса, либо UWP one, либо.NET 4.6 one. Конечно, вы также будете ссылаться на общую переносимую библиотеку классов из обоих приложений, а также на правильную библиотеку классов для каждой платформы.
Другие вопросы по тегам