2013-08-19 3 views
1

Почему?Может ли MvvmCross использовать сторонние представления, которые определены внутри внешних сборок (т. Е. Для конкретных видов платформы, на которые он не контролирует)?

Я пытаюсь создать плагин аутентификации Mvx, который как можно больше повторяет существующий сторонний код и его интерфейсы для платформы. Есть несколько сообщений SO о том, как ссылаться на Mvx-вид View/ViewModel в другой сборке, но я хотел бы знать, есть ли какой-либо способ для Mvx поддерживать навигацию и/или отображение View/ViewModel, чтобы он не создавал/контроль?

Я предполагаю, что мне нужно как-то сказать Mvx о «дополнительном внешнем видении входа», чтобы даже иметь возможность работать, но я не знаю, можно ли это сделать, когда я не контролирую платформу, специфический View/ViewModel, который предоставляется во внешней DLL.

Текущий подход, который не работает

Давайте назовем мой MVX AuthN Plugin:

Acme.MvvmCross.Plugins.Authentication 

ядро ​​PCL этого плагина содержит только некоторые PCL-дружественные перечислений, просто ПОКО, и в IAuthenticationProvider, что чем связанные с платформой проекты плагина будут реализованы.

С течением времени различные сторонние «шлюзы аутентификации» могут поддерживаться в качестве допустимых реализаций платформы для интерфейса IAuthenticationProvider.

Первым третьим лицом, поддерживающим плагин Mvx, является «Windows Azure Mobile Services (AMS)» на Windows Phone 7.5/8 & Win8. AMS уже предоставляет C# PCL для обеспечения аутентификации на WP7/8 & Win 8: https://github.com/WindowsAzure/azure-mobile-services, и я буду беспокоиться о добавлении Xamarin-предоставленных iOS/Droid реализаций из них позже: https://github.com/xamarin/azure-mobile-services.

Подход AMS должен иметь основной PCL: Microsoft.WindowsAzure.Mobile , и они объединяют это ядро ​​с расширениями для платформы и представлениями UI по мере необходимости.

Пример:

Внутри WP75-конкретного проекта библиотеки моего плагина (Acme.MvvmCross.Plugins.Authentication.WindowsPhone), это то, что ссылки AMS NuGet:

Microsoft.WindowsAzure.Mobile 
Microsoft.WindowsAzure.Mobile.Ext.WP75 
Microsoft.WindowsAzure.Mobile.UI.WP75 

Обратите внимание, что делает ядро ​​PCL моего плагина (Acme.MvvmCross.Plugins.Authentication) НЕ ссылайтесь ни на одну из этих AMS DLL.

Я могу ссылаться и использовать приведенный выше Mvx-плагин в моем ядре PCL моего приложения и в проектах, специфичных для клиента приложения, НО я не могу получить «вид входа в систему» ​​(предоставленный AMS SDK), чтобы показывая на клиентах WP7/8, они просто блокируются, когда я вызываю метод LoginAsync AMS.

Пример:

Если вы не используете MVX образцы AMS показать, как проект манданта можно просто назвать это общий метод «LoginAsync» и, делая это, расширения специфичные для клиента и UI, что они обеспечивают волшебный удар, чтобы отобразить экран Провайдера аутентификации, чтобы позволить пользователю войти в систему (например, вход в Twitter в веб-виде на телефоне).

Когда я называю AMS-х LoginAsync из моего MVX приложение LoginViewModel (через службу MVX в том же приложении, которое использует мой MVX плагин), пользовательский Логин UI обеспечивается AMS не отображается, клиент просто запирает вверх.

Есть ли способ повторно использовать существующую/текущую работу Azure/Xamarin AMS через модель плагина Mvx или это не произойдет?

Примечание: Источник AMS SDK доступен как из Microsoft, так и из Xamarin, но я, скорее всего, избегу этого подхода, если мне нужно поддерживать специальные вики MVX для обоих этих репозиториев, чтобы все это работало по желанию.

+0

Это похож на использование встроенных в Views/задач захватить фотографию? В этом случае поможет ли источник для плагина выбора изображения? Стюарт (на мобильном телефоне) – Stuart

+0

Я не уверен. Если в конечном счете моя служба Mvx обращается к базовому «LoginAsync» (при условии, что моя плагиновая упаковка Azure DLL), которая автоматически пытается загрузить/перейти на этот PhoneApplicationPage https://github.com/WindowsAzure/azure-mobile-services/ blob/master/sdk/Managed/src/Microsoft.WindowsAzure.MobileServices.WindowsPhone8.UI/Аутентификация/АутентификацияBroker.cs # L92, если он «просто работает» или мне нужно помочь Mvx понять, как справиться с этой родной страницей WP8 чтобы показать его после того, как пользователь лижет поставщика авторизации на MvxPhonePage, который показывает список параметров входа? – Kerry

+0

Использование плагинов MvxPictureChooser & EMail в качестве руководства, чтобы увидеть, как они использовали «MvxWindowsPhoneTask», было шагом в правильном направлении. Я смог заставить AMS-клиента окончательно отобразить экран входа в твиттер, как и ожидалось! Мне пришлось использовать параметр Action для DoWithInvalidOperationProtection, хотя в настоящее время я теряю свой возвращаемый тип и больше не проверяю ошибок. Есть некоторые вещи, которые я делал при использовании ваших плагинов в качестве руководства, которое не кажется правильным, поэтому я собираюсь его очистить, а затем спросить, правильно ли я использую Mvx, прежде чем я/мы опубликуем обновленный ответ здесь. Спасибо за подсказку! – Kerry

ответ

0

Вы можете сделать что-то похожее на this dialog messages solution. вы в основном используете мессенджер и слушаете сообщение Authenticate в представлениях для каждой платформы, чтобы показать свой интерфейс входа в систему и отправить сообщение обратно, когда это будет сделано.

Я использую старые управление Azure ACS аналогичным образом (стреляя сообщение, чтобы показать их и привязку к событиям на UserControl для результата)

+0

Спасибо за подсказку, я посмотрю на это. Если вы посмотрите на мой комментарий к Стюарту по оригинальному вопросу, вы точно знаете, что использование этого простого прямого вызова в «LoginAsync» в AMS DLL наверняка не отобразит экран входа в систему авторизации, не используя этот метод обмена сообщениями? Смысл, возможно ли, я мог бы заставить его работать по своему усмотрению (позвоните в LoginAsync и дайте ему встроенный просмотр входа в систему) или на основе вашего понимания, не будет ли это возможным в Mvx без этого обходного пути? – Kerry

+0

EShy - Я думаю, что ответ на этот вопрос будет в том, что предложил Стюарт выше, потому что я смог использовать этот подход плагина и просто вызывать LoginAsync без необходимости передавать сообщения. Я хочу посмотреть, как выглядит окончательный ответ, прежде чем принять/ввести ответ здесь. Благодаря! – Kerry