.NET 4.5 Переносимые библиотеки классов: можно ли определить платформу во время выполнения?

У меня есть набор библиотек, предназначенных для Silverlight и Windows Phone 7.5. В моих библиотеках есть решение для навигации с общим интерфейсом, но разными реализациями — в зависимости от платформы. (Навигация SL и WP7 очень похожа, есть совсем небольшие отличия, к сожалению их не избежать)

Если бы мне пришлось написать переносимую библиотеку классов, содержащую мой интерфейс INavigationModel + обе реализации, есть ли способ определить, какая платформа вызывает переносимую библиотеку классов? Эта информация поможет мне выбрать правильную реализацию моего решения во время выполнения.

Ваше здоровье

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


person Maciek    schedule 23.08.2012    source источник


Ответы (2)


На самом деле это может работать не так хорошо. Даже если бы вы могли надежно определить среду, в которой вы работаете (возможно, какой-то взлом с Environment.OperatingSystem), если ваша реализация имеет какую-либо сложность, маловероятно, что вы могли бы полностью придерживаться наименьшего общего знаменателя определенных типов/ методы и др.

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

person nitzmahone    schedule 23.08.2012
comment
Боюсь, до этого может дойти, но посмотрим, есть ли другие варианты для изучения. - person Maciek; 24.08.2012
comment
Недавняя статья, которая также может помочь: blogs.msdn.com/b/dsplaisted/archive/2012/08/27/ - person nitzmahone; 28.08.2012

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

Я бы рекомендовал, чтобы конкретная реализация INavigationService жила в самих проектах, специфичных для платформы, тогда как общая абстракция жила в переносимом проекте. Затем используйте контейнер IoC или инфраструктуру, подобную ServiceLocator, чтобы подключить их (я бы рекомендовал Autofac). Я сделал подобное в статье (на самом деле я сделал это для навигационного сервиса), я написал для MSDN: Создайте непрерывный клиент с помощью переносимых библиотек классов. Обязательно загрузите исходный код, чтобы увидеть конкретный пример.

person David Kean    schedule 12.09.2012
comment
Примерно так я начал с этим работать; когда я создаю экземпляр своего PCL, я передаю ему экземпляры необходимых интерфейсов, содержащих специфичные для платформы реализации. Конечно, теперь мне нужно посмотреть, что вы подразумеваете под ServiceLocator, потому что, похоже, я мог бы избежать передачи экземпляра;) - person Collin Grady; 23.01.2013