O introducere în Xamarin.Forms și mesagerie

Încă de când a fost introdus Xamarin 3, în jurul lui a avut loc un pic de buziere. Ideea de a crea o aplicație mobilă, inclusiv interfața cu utilizatorul, folosind o singură bază de cod, este uimitoare. Dar Xamarin.Forms este mult mai mult decât atât. Una dintre caracteristicile adesea trecute cu vederea în Xamarin.Forms este conceptul de Mesagerie și acesta este subiectul acestui tutorial.

1. Ce este mesageria?

Dacă aveți experiență de scriere a software-ului în medii de afaceri, este posibil să aveți experiență în aplicațiile dvs. sau să aveți cel puțin auzit de mesaje. Mesageria este un termen folosit pentru a descrie aplicațiile care profită de publica / abona (pub / sub). Arhitectura de publicare / abonare este formată din trei jucători principali:

  • mesaje
  • editori
  • abonați

Punctul central al acestui proces este în jurul mesajelor. Mesajele sunt pur și simplu o modalitate de a transmite informații despre un anumit eveniment care a avut loc. Acest eveniment este în mod obișnuit legat de un fel de proces de afaceri și conține informații solicitate de sistemele care vor utiliza în cele din urmă aceste date pentru a efectua o altă operațiune.

Ceilalți doi jucători, editori și abonați, sunt furnizorii acestor mesaje. După cum sugerează și numele, editorii sunt expeditorii a mesajelor și abonaților sunt receptoare a mesajelor.

Cum funcționează mesageria?

Procesul de bază al mesageriei este destul de simplu. În cadrul unui sistem, apare un anumit eveniment. Acest eveniment ar putea fi ceva simplu, ca și cum un utilizator dă clic pe un buton sau este la fel de complex ca o regulă de afacere care trage într-o aplicație de tranzacționare a unei mari companii financiare. În lumea mesageriei, există o mică diferență între aceste două lucruri. Tot ce trebuie să știți este că sa întâmplat ceva.

Când apare un eveniment, un editor va lua informațiile despre acest eveniment și îl va lega într-un mesaj. Acest mesaj va avea un fel de tip legat de acesta, precum și date suplimentare care descriu evenimentul. Tipul este foarte important mai târziu în acest proces. Odată ce acest mesaj este creat, editorul îl va trimite într-un sistem. Din acel moment, editorul nu mai are grijă de acest eveniment sau mesaj. Există câteva tipuri de editori care au nevoie de un răspuns, dar acest lucru nu este foarte important în cazul nostru.

La celălalt capăt al ecuației sunt abonații. Abonații sunt exact opusul editorilor. Ei așteaptă ca mesajele de un anumit tip să fie publicate. Aici vin numele lor, sunt abonați la anumite tipuri de evenimente. Atunci când un abonat vede că a avut loc un eveniment la care s-au subscris, va lua acest mesaj și toate datele și va face ceva cu el. Odată ce acest proces este complet, abonatul revine la așteptarea mai multor mesaje.

De ce să folosiți mesajele?

Având în vedere această arhitectură, s-ar putea să vă întrebați de ce sau când ar trebui să o utilizați. În mod tipic, dezvoltatorii aleg să folosească acest tip de arhitectură din două motive: cuplarea și scalabilitatea.

Cuplaj slab

În ceea ce privește dezvoltarea de software, cuplarea liberă este conceptul de păstrare a diferitelor componente din cadrul aplicației dvs. cât mai separate posibil, până la punctul pe care ei îl știu cât mai puțin unul cu celălalt posibil. Această separare permite dezvoltatorilor să se concentreze mai mult pe funcționalitatea unui sistem și mai puțin pe interacțiunea dintre diferite componente sau piese ale sistemului. Acest lucru permite schimbări mai ușoare de funcționalitate și testarea diferitelor componente.

scalabilitate

Scalabilitatea are legătură cu modul în care un sistem poate crește fără a trebui să refaceți și să re-arhiteze în mod constant întreaga soluție. Când vine vorba de mesagerie, dacă trebuie să faci un fel de procesare suplimentară atunci când un anumit mesaj este detectat, un nou abonat este creat pentru a face față acestei funcționalități, spre deosebire de necesitatea de a deschide o piesă existentă de cod și de a face schimbări.

Acum, să vedem cum putem pune această arhitectură extrem de puternică în aplicațiile noastre mobile folosind Xamarin.

2. Utilizarea mesajelor în Xamarin.Forms

Intrarea în lumea mesageriei în Xamarin.Forms este de fapt destul de simplă acum că înțelegem conceptele de bază ale mesageriei. Tot ce avem nevoie acum este o construcție pentru a le accesa. Din fericire pentru noi, există o singură clasă pe care trebuie să ne îngrijorăm și asta este MessagingCenter.  MessagingCenter clasa face parte din Xamarin.Forms și are metode care să ne ajute atât cu publicarea cât și cu abonarea la mesaje. Să aruncăm o privire la fiecare.

Publica

Prima metodă pe care o vom examina în MessagingCenter clasa este Trimite. Deși conceptul într-un context de mesagerie este publicat, utilizează implementarea Xamarin.Forms Trimite. Există două versiuni ale Trimite care poate fi utilizată pentru a publica date.

  • MessagingCenter.Send(Expeditor TSender, mesaj șir)
  • MessagingCenter.Send(Expeditorul TSender, mesajul cu șir, instrucțiunile TArgs)

Ambele opțiuni sunt generice. Primul vă permite să specificați expeditorul acestui mesaj, iar cel de-al doilea permite și un argument secundar, tipul încărcăturii utile.

Este important să subliniem că TArgs parametrul generic poate fi orice tip. Poate fi ceva simplu ca a şir sau la fel de complex ca un tip personalizat.

Abonati-va

Acum că înțelegem cum să publicăm sau Trimite, mesaje în sistem, este timpul să vă abonați ceva. Pentru a face acest lucru, vom folosi Abonati-va metoda pe MessagingCenter clasă.

Similar cu cele două versiuni ale Trimite metodă, Abonati-va metoda are, de asemenea, două suprasarcini.

  • MessagingCenter.Subscribe(abonat obiect, mesaj șir, acțiune apel invers, expeditor TSender = null)
  • MessagingCenter.Subscribe(abonat obiect, mesaj șir, acțiune apel invers, expeditor TSender = null)

Pentru Abonati-va metode, specificăm cine este abonatul. În mod tipic vom specifica acest pentru primul parametru. Al doilea parametru va conține același nume de mesaj care a fost specificat în Trimite astfel încât să putem fi anunțați când mesajul respectiv a fost trimis. Al treilea parametru este un delegat generic care acceptă expeditorul și, eventual, args, în funcție de versiunea utilizată a metodei. Delegatul este un apel invers care este executat atunci când un mesaj de acest tip este publicat. În cele din urmă este un parametru nullabil care specifică ce TSender acest mesaj ar trebui să fie subscris pentru. Poate fi lăsată ca nul să acceptați acest tip de mesaj de la orice expeditor.

Mare, acum suntem abonați la mesaje, dar dacă nu ne mai pasă de anumite mesaje? Buna intrebare. Există încă o metodă care trebuie luată în considerare.

Dezabonare

Un proces adesea ignorat în lumea mesageriei este dezabonarea. Când lucrați într-o infrastructură foarte mare a unei clase de întreprinderi, poate că nu este la fel de importantă. În schimb, atunci când lucrați într-un mediu mai mic, cum ar fi un telefon, devine tot mai important.

Chiar dacă utilizarea arhitecturii de mesagerie permite o mai mare flexibilitate și scalabilitate, aceasta are încă resurse de sistem. Din acest motiv, nu putem continua să creștem numărul de abonați într-un sistem infinit. În acest caz, trebuie să respectăm cât mai bine resursele. În Xamarin.Forms, modul în care facem acest lucru este prin apelarea Dezabonare metodă. Această metodă ne permite să spunem că nu ne mai pasă de un anumit mesaj care este publicat în sistem.

Dezabonare metoda are, de asemenea, două suprasarcini.

  • MessagingCenter.Unsubscribe(abonat obiect, mesaj șir)
  • MessagingCenter.Unsubscribe(abonat obiect, mesaj șir)

Este posibil să observați că argumentele generice nu se manifestă în lista de parametri. Numai dezvoltatorii au o idee bună despre ce anume, dar cred că este probabil mai mult o formalitate. Oricum, am ales să fiu consecvent în toate apelurile mele Trimite, Abonati-va, și Dezabonare, și folosiți aceleași semnături și argumente pentru a elimina orice fel de confuzie.

Acum, că înțelegem conceptele de bază ale mesageriei, este timpul să creăm un exemplu simplu care să utilizeze aceste idei.

3. Crearea unui exemplu

În acest exemplu, vom crea o aplicație simplă Xamarin.Forms care va folosi toate cele trei metode ale MessagingCenter clasa menționată anterior în acest articol. Aplicația însăși poate părea mai degrabă lipsită de importanță, dar va oferi o ilustrație utilă a modului în care aceste concepte se pot utiliza în aplicațiile dvs. care merg înainte.

Pasul 1: Creați o aplicație Xamarin.Forms

Vom începe prin crearea unei noi aplicații Xamarin.Forms. Pentru a realiza acest lucru, deschideți Xamarin Studio (sau Visual Studio) și selectați Fișier> Noua soluție. În Noua soluție dialog, selectați Aplicații pentru mobil șablon și alegeți unul dintre șabloane. Voi selecta PCL versiune, dar ați putea folosi Proiect comun dacă doriți.

Pasul 2: Adăugați un anumit cod

Odată ce soluția este creată, să adăugăm un cod. În proiectul comun, creați o nouă clasă și denumiți-o Pagina principală. Acesta va fi ecranul din aplicație care va conține interfața cu utilizatorul, precum și logica. Acest lucru poate fi în mod evident eliminat în mai multe piese logice, dar această aplicație este suficient de simplă, încât nu cred că era necesar.

Înlocuiți conținutul MainPage.cs fișier cu următoarele:

utilizând Sistemul; folosind Xamarin.Forms; folosind System.Collections.Generic; folosind System.Collections.ObjectModel; spațiul de nume MessagingSample public class MainPage: ContentPage listă privată _eventTimes; bool privat _isSubscribed = false; privat ListView _eventList; public MainPage () _eventTimes = Listă nouă (); var clearButton = butonul nou Text = "Clear"; clearButton.Clicked + = (expeditor, e) => _eventTimes.Clear (); UpdateList (); ; var publishButton = Butonul nou Text = "Publicare"; publishButton.Clicked + = (expeditor, e) => MessagingCenter.Send(aceasta, "boom", DateTime.Now); ; var subUnsubButton = buton nou Text = "Abonare"; subUnsubButton.Clicked + = (expeditor, e) => _isSubscribed =! _isSubscribed; dacă _Subscribed) subUnsubButton.Text = "Dezabonare"; MessagingCenter.Subscribe(aceasta, "boom", (pagină, timp) => _eventTimes.Add (time.ToString ()); UpdateList (););  altceva subUnsubButton.Text = "Abonare"; MessagingCenter.Unsubscribe(aceasta, "boom"); ; var butonStack = StackLayout nou Spacing = 20, Padding = 20, Orientation = StackOrientation.Horizontal, Copii = publishButton, subUnsubButton, clearButton, HorizontalOptions = LayoutOptions.CenterAndExpand; _eventList = nou ListView ItemsSource = new ObstableCollection(_eventTimes); var mainStackLayout = StackLayout nou Copii = butonStack, _eventList, HorizontalOptions = LayoutOptions.FillAndExpand, VerticalOptions = LayoutOptions.FillAndExpand; Conținut = mainStackLayout;  void privat UpdateList () _eventList.ItemsSource = new ObservableCollection (_eventTimes); 

Acest lucru poate părea inițial un pic copleșitor, dar vă asigur că este destul de simplu. Există trei butoane:

  • Publica: utilizează Trimite metoda de a publica un mesaj cu numele de bum
  • Abonare / Renunțare: împiedică înscrierea / dezabonarea paginii bum
  • Clar: șterge conținutul ListView

Premisa de bază a acestei aplicații este aceea că începe într-o stare nesubscrisă. În această stare, dacă atingeți Publica butonul nu pare să se întâmple nimic. Știm că bum mesajul este publicat, dar deoarece nu există abonați, nu se întâmplă nimic.

Odată ce atingeți Abonati-va , aplicația intră într - o stare de abonare în care acum asculta pentru bum mesaj. Când primește acest mesaj, plasează un mesaj nou DateTime valoare în _eventTimes colecție, care se actualizează în _eventList ListView prin intermediul unui ObservableCollection.

Restul codului este doar o bază de formatare și spațiere. 

Pasul 3: Construiți și executați

Rularea aplicației în simulatorul iOS ar trebui să arate similar cu aceasta:

În mod similar, starea inițială în Emulator Android ar trebui să arate astfel:

După ce ați apăsat butonul Abonati-va butonul și publicarea câtorva mesaje, ar trebui să începeți să vedeți interfața de utilizator actualizată prin obținerea unor mesaje DateTime valori în ListView.

Concluzie

Acolo îl aveți. Ați creat cu succes o aplicație Xamarin.Forms care profită de o arhitectură care este de obicei rezervată întreprinderilor mari. Ar trebui să vă simțiți destul de entuziasmat în acest moment, deoarece acum aveți un nou instrument în centura dvs. de scule, care vă va permite să creați aplicații foarte scalabile și flexibile, fără să mai vorbim de testare, care pot rula în mâna utilizatorului final. Și asta poate deschide ușa mai multor posibilități.

Cod