Introduzione a Xamarin.Forms e Messaging

Da quando Xamarin 3 è stato introdotto, c'è stato un po 'di buzz intorno. L'idea di essere in grado di creare un'applicazione mobile, compresa l'interfaccia utente, utilizzando un'unica base di codice è sorprendente. Ma Xamarin.Forms è molto più di questo. Una delle funzionalità spesso trascurate incluse in Xamarin.Forms è il concetto di messaggistica e questo è l'argomento di questo tutorial.

1. Che cos'è la messaggistica?

Se hai esperienza nella scrittura di software in ambienti aziendali, potresti anche avere esperienza con o avere almeno sentito parlare di messaggistica nelle tue applicazioni. Messaging è un termine usato per descrivere le applicazioni che sfruttano il publish / subscribe (pub / sotto) modello di progettazione. L'architettura di pubblicazione / sottoscrizione è composta da tre attori principali:

  • messaggi
  • editori
  • iscritti

L'obiettivo centrale di questo processo è intorno ai messaggi. I messaggi sono semplicemente un modo per trasmettere informazioni su un certo evento è successo. Questo evento è in genere legato a una sorta di processo aziendale e contiene le informazioni richieste dai sistemi che alla fine utilizzeranno questi dati per eseguire qualche altra operazione.

Gli altri due giocatori, editori e abbonati, sono i fornitori di questi messaggi. Come indicano i nomi, gli editori sono i mittenti dei messaggi e gli abbonati sono i ricevitori dei messaggi.

Come funziona la messaggistica?

Il processo di base della messaggistica è piuttosto semplice. All'interno di un sistema, si verifica un determinato evento. Questo evento potrebbe essere qualcosa di semplice, come un utente che fa clic su un pulsante o complesso come una regola aziendale che si attiva nell'applicazione commerciale di una grande impresa finanziaria. Nel mondo della messaggistica, c'è poca differenza tra queste due cose. Tutto quello che devi sapere è che qualcosa è successo.

Quando si verifica un evento, un editore prenderà le informazioni su questo evento e lo impacchetterà in un messaggio. Questo messaggio avrà una sorta di genere legato ad esso così come i dati aggiuntivi che descrivono l'evento. Il tipo è molto importante più avanti nel processo. Una volta che questo messaggio è stato creato, il publisher lo invierà in qualche sistema. Da quel momento, l'editore non si preoccupa più di questo evento o messaggio. Ci sono alcuni tipi di editori che devono ottenere una risposta, ma nel nostro caso non è molto importante.

All'altra estremità dell'equazione ci sono gli abbonati. Gli abbonati sono l'esatto opposto degli editori. Aspettano che vengano pubblicati messaggi di un certo tipo. Questo è da dove viene il loro nome, sono abbonati a certi tipi di eventi. Quando un abbonato vede che si è verificato un evento a cui sono iscritti, prenderà questo messaggio e tutti i suoi dati, e farà qualcosa con esso. Una volta completato questo processo, l'abbonato torna in attesa di altri messaggi.

Perché dovresti usare la messaggistica?

Con questa architettura in mente, ti starai chiedendo perché o quando dovresti usarlo. In genere, gli sviluppatori scelgono di utilizzare questo tipo di architettura per due motivi: accoppiamento lento e scalabilità.

Accoppiamento lasco

In termini di sviluppo del software, l'accoppiamento libero è il concetto di mantenere diversi componenti all'interno della propria applicazione il più possibile separati al punto che sanno quanto meno l'uno l'altro il più possibile. Questa separazione consente agli sviluppatori di concentrarsi maggiormente sulla funzionalità di un sistema e meno sull'interazione di diversi componenti o parti del sistema. Ciò consente modifiche più semplici della funzionalità e test di diversi componenti.

scalabilità

La scalabilità ha a che fare con il modo in cui un sistema può crescere senza dover continuamente rielaborare e riprogettare l'intera soluzione. Quando si tratta di messaggistica, se è necessario eseguire una sorta di elaborazione aggiuntiva quando viene rilevato un determinato messaggio, viene creato un nuovo sottoscrittore per gestire tale funzionalità anziché dover aprire una parte di codice esistente e apportare modifiche.

Ora, vediamo come possiamo utilizzare questa architettura estremamente potente nelle nostre applicazioni mobili utilizzando Xamarin.

2. Utilizzo della messaggistica in Xamarin.Forms

Entrare nel mondo della messaggistica in Xamarin.Forms è in realtà abbastanza semplice ora che comprendiamo i concetti di base della messaggistica. Tutto ciò di cui abbiamo bisogno ora è un costrutto per accedervi. Fortunatamente per noi, c'è solo una classe di cui dobbiamo veramente preoccuparci e che è MessagingCenter. Il MessagingCenter la classe fa parte di Xamarin.Forms e ha dei metodi per aiutarci sia con la pubblicazione che con la sottoscrizione ai messaggi. Diamo un'occhiata a ciascuno.

Pubblicare

Il primo metodo che daremo un'occhiata al MessagingCenter la classe è Inviare. Sebbene il concetto in un contesto di messaggistica sia pubblicato, viene utilizzata l'implementazione di Xamarin.Forms Inviare. Esistono due versioni di Inviare metodo che può essere utilizzato per pubblicare dati.

  • MessagingCenter.Send(Mittente di TSender, messaggio di stringa)
  • MessagingCenter.Send(Mittente di TSender, messaggio di stringa, argomenti di TArgs)

Entrambe queste opzioni sono generiche. Il primo consente di specificare il mittente di questo messaggio e il secondo consente anche un argomento secondario, il tipo di payload.

È importante sottolineare che il Targs parametro generico può essere di qualsiasi tipo. Può essere qualcosa di semplice come un stringa o complesso come un tipo personalizzato.

sottoscrivi

Ora che abbiamo capito come pubblicare, o Inviare, messaggi nel sistema, è ora che qualcosa li iscriva. Per farlo, useremo il sottoscrivi metodo sul MessagingCenter classe.

Simile alle due versioni di Inviare metodo, il sottoscrivi il metodo ha anche due sovraccarichi.

  • MessagingCenter.Subscribe(Sottoscrittore oggetto, messaggio stringa, Azione callback, TSender sender = null)
  • MessagingCenter.Subscribe(Sottoscrittore oggetto, messaggio stringa, Azione callback, TSender sender = null)

Per il sottoscrivi metodi, stiamo specificando chi è l'abbonato. In genere specificheremo Questo per il primo parametro. Il secondo parametro conterrà lo stesso nome messaggio che è stato specificato nel file Inviare metodo in modo che possiamo essere avvisati quando quel particolare messaggio è stato inviato. Il terzo parametro è un delegato generico che accetta il mittente e probabilmente args, a seconda della versione del metodo utilizzata. Il delegato è un callback che viene eseguito quando viene pubblicato un messaggio di questo tipo. Infine è un parametro nullable che specifica quale TSender questo messaggio dovrebbe essere sottoscritto per. Può essere lasciato come nullo accettare questo tipo di messaggio da qualsiasi mittente.

Bene, ora ci stiamo iscrivendo ai messaggi, ma cosa succede se non ci preoccupiamo più di certi messaggi? Buona domanda. C'è un altro metodo da prendere in considerazione.

Annulla l'iscrizione

Un processo spesso trascurato nel mondo della messaggistica è l'annullamento dell'iscrizione. Quando lavori in un'infrastruttura aziendale di grandi dimensioni, forse non è altrettanto importante. Al contrario, quando si lavora in un ambiente più piccolo, come un telefono, diventa più importante.

Anche se l'utilizzo dell'architettura di messaggistica consente maggiore flessibilità e scalabilità, richiede comunque risorse di sistema. Per questo motivo, non possiamo continuare ad aumentare il numero di abbonati in un sistema all'infinito. Stando così le cose, dobbiamo essere rispettosi delle risorse nel miglior modo possibile. In Xamarin.Forms, il modo in cui lo facciamo è chiamando il Annulla l'iscrizione metodo. Questo metodo ci consente di dire che non ci interessa più che un particolare messaggio venga pubblicato nel sistema.

Il Annulla l'iscrizione il metodo ha anche due sovraccarichi.

  • MessagingCenter.Unsubscribe(sottoscrittore di oggetto, messaggio di stringa)
  • MessagingCenter.Unsubscribe(sottoscrittore di oggetto, messaggio di stringa)

Si può notare che gli argomenti generici non si manifestano nella lista dei parametri. Solo gli sviluppatori hanno una buona idea del perché esattamente, ma ritengo che sia probabilmente più di una formalità. Ad ogni modo, scelgo di essere coerente per tutte le mie chiamate a Inviare, sottoscrivi, e Annulla l'iscrizione, e usare le stesse firme e argomenti per eliminare ogni tipo di confusione.

Ora che comprendiamo i concetti di base della messaggistica, è tempo di creare un semplice esempio utilizzando queste idee.

3. Creare un esempio

In questo esempio, creeremo una semplice app Xamarin.Forms che utilizzerà tutti e tre i metodi di MessagingCenter classe menzionata precedentemente in questo articolo. L'app stessa potrebbe sembrare piuttosto irrilevante, ma fornirà un'utile illustrazione di come utilizzare questi concetti nelle tue app in futuro.

Passaggio 1: crea un'app Xamarin.Forms

Inizieremo creando una nuova app Xamarin.Forms. Per fare ciò, apri semplicemente Xamarin Studio (o Visual Studio) e seleziona File> Nuova soluzione. Nel Nuova soluzione finestra di dialogo, selezionare il App per dispositivi mobili modello famiglia e scegliere uno dei modelli. Selezionerò il PCL versione, ma potresti usare il Progetto condiviso versione se ti piace.

Passaggio 2: aggiungi un codice

Una volta creata la soluzione, aggiungiamo del codice. Nel progetto condiviso, crea una nuova classe e assegnagli un nome Pagina principale. Questa sarà la schermata dell'applicazione che conterrà l'interfaccia utente e la logica. Questo può ovviamente essere suddiviso in parti più logiche, ma questa applicazione è abbastanza semplice che non pensavo fosse necessaria.

Sostituisci il contenuto del MainPage.cs file con il seguente:

usando il sistema; usando Xamarin.Forms; using System.Collections.Generic; using System.Collections.ObjectModel; namespace MessagingSample public class MainPage: ContentPage Lista privata _eventTimes; bool privato _isSubscribed = false; ListView privato _eventList; public MainPage () _eventTimes = new List (); var clearButton = new Button Text = "Clear"; clearButton.Clicked + = (sender, e) => _eventTimes.Clear (); UpdateList (); ; var publishButton = new Button Text = "Publish"; publishButton.Clicked + = (sender, e) => MessagingCenter.Send(questo, "boom", DateTime.Now); ; var subUnsubButton = new Button Text = "Iscriviti"; subUnsubButton.Clicked + = (sender, e) => _isSubscribed =! _isScritto; if (_isSscribed) subUnsubButton.Text = "Unsubscribe"; MessagingCenter.Subscribe(questo, "boom", (page, time) => _eventTimes.Add (time.ToString ()); UpdateList (););  else subUnsubButton.Text = "Iscriviti"; MessagingCenter.Unsubscribe(questo, "boom"); ; var buttonStack = new StackLayout Spacing = 20, Padding = 20, Orientation = StackOrientation.Horizontal, Children = publishButton, subUnsubButton, clearButton, HorizontalOptions = LayoutOptions.CenterAndExpand; _eventList = new ListView ItemsSource = new ObservableCollection(_eventTimes); var mainStackLayout = new StackLayout Children = buttonStack, _eventList, HorizontalOptions = LayoutOptions.FillAndExpand, VerticalOptions = LayoutOptions.FillAndExpand; Content = mainStackLayout;  private void UpdateList () _eventList.ItemsSource = new ObservableCollection (_eventTimes); 

Inizialmente questo potrebbe sembrare un po 'schiacciante, ma ti assicuro che è piuttosto semplice. Ci sono tre pulsanti:

  • Pubblicare: usa il Inviare metodo per pubblicare un messaggio con un nome di boom
  • Subscribe / Unsubscribe: capovolge la pagina dall'essere iscritto / disiscritto da boom
  • Chiaro: cancella il contenuto di Visualizzazione elenco

La premessa di base di questa applicazione è che inizia in uno stato non iscritto. In questo stato, se si tocca il Pubblicare pulsante, niente sembra accadere. Sappiamo che il boom messaggio viene pubblicato, ma poiché non ci sono abbonati, non succede nulla.

Una volta che si tocca il sottoscrivi pulsante, l'applicazione entra in uno stato sottoscritto in cui è ora in ascolto per il boom Messaggio. Quando riceve questo messaggio, ne pone uno nuovo Appuntamento valore nel _eventTimes collezione, che viene aggiornata nel _eventList Visualizzazione elenco via un ObservableCollection.

Il resto del codice è solo un po 'di formattazione e spaziatura di base. 

Passaggio 3: costruisci ed esegui

L'esecuzione dell'applicazione in iOS Simulator dovrebbe essere simile a questa:

Allo stesso modo, lo stato iniziale nell'emulatore Android dovrebbe assomigliare a questo:

Dopo aver toccato il sottoscrivi pulsante e pubblicando alcuni messaggi, dovresti iniziare a vedere l'interfaccia utente che viene aggiornata acquisendone alcuni Appuntamento valori nel Visualizzazione elenco.

Conclusione

Ecco qua. Hai creato con successo un'app Xamarin.Forms che sfrutta un'architettura tipicamente riservata alle grandi imprese. Dovresti sentirti piuttosto eccitato a questo punto poiché ora hai un nuovo strumento nella tua cintura degli attrezzi che ti permetterà di creare applicazioni scalabili e flessibili, per non dire testabili, che possono essere eseguite nella mano dell'utente finale. E questo può aprire la porta a molte più possibilità.