Een inleiding tot Xamarin.Forms en Messaging

Sinds Xamarin 3 is geïntroduceerd, is er nogal wat geroezemoes omheen geweest. Het idee van het kunnen maken van een mobiele applicatie, inclusief de gebruikersinterface, met behulp van een enkele codebasis is verbazingwekkend. Maar Xamarin.Forms is zoveel meer dan dat. Een van de vaak over het hoofd geziene functies in Xamarin.Forms is het concept van Messaging en dat is het onderwerp van deze tutorial.

1. Wat is berichten??

Als u ervaring hebt met het schrijven van software in bedrijfsomgevingen, hebt u mogelijk ook ervaring met berichten of hebt u er al van gehoord in uw toepassingen. Berichten is een term die wordt gebruikt om toepassingen te beschrijven die misbruik maken van de publish / subscribe (pub / sub) ontwerppatroon. De publish / subscribe-architectuur bestaat uit drie primaire spelers:

  • berichten
  • uitgevers
  • abonnees

De centrale focus van dit proces ligt rond de berichten. Berichten zijn gewoon een manier om informatie over een bepaalde te verzenden evenement dat is gebeurd. Deze gebeurtenis is meestal gekoppeld aan een of ander bedrijfsproces en bevat informatie die vereist is door systemen die deze gegevens uiteindelijk zullen gebruiken om een ​​andere bewerking uit te voeren.

De andere twee spelers, uitgevers en abonnees, zijn de leveranciers van deze berichten. Zoals de namen impliceren, zijn de uitgevers het afzenders van de berichten en de abonnees zijn de ontvangers van de berichten.

Hoe werkt berichten??

Het basisproces van berichten is vrij eenvoudig. Binnen een systeem vindt een bepaalde gebeurtenis plaats. Deze gebeurtenis kan iets eenvoudigs zijn, zoals een gebruiker die op een knop klikt, of zo complex als een bedrijfsregel die wordt geactiveerd door de handelsapp van een groot financieel bedrijf. In de wereld van berichten is er weinig verschil tussen deze twee dingen. Het enige dat u moet weten, is dat er iets is gebeurd.

Wanneer een gebeurtenis plaatsvindt, neemt een uitgever de informatie over deze gebeurtenis en bundelt deze in een bericht. Dit bericht zal een soort hebben type verbonden en aanvullende gegevens die de gebeurtenis beschrijven. Het type is erg belangrijk later in het proces. Zodra dit bericht is gemaakt, stuurt de uitgever het naar een bepaald systeem. Vanaf dat moment geeft de uitgever niet langer meer om deze gebeurtenis of bericht. Er zijn enkele soorten uitgevers die een reactie moeten krijgen, maar dat is in ons geval niet erg belangrijk.

Aan de andere kant van de vergelijking staan ​​de abonnees. Abonnees zijn precies het tegenovergestelde van de uitgevers. Ze wachten op het publiceren van berichten van een bepaald type. Dit is waar hun naam vandaan komt, ze zijn geabonneerd op bepaalde soorten evenementen. Wanneer een abonnee ziet dat een gebeurtenis waarbij ze zijn geabonneerd zich heeft voorgedaan, zal deze dit bericht en alle bijbehorende gegevens meenemen en er iets mee doen. Zodra dit proces voltooid is, gaat de abonnee terug naar het wachten op meer berichten.

Waarom zou u berichten gebruiken??

Met deze architectuur in gedachten, vraag je je misschien af ​​waarom of wanneer je het zou moeten gebruiken. Gewoonlijk kiezen ontwikkelaars ervoor om dit type architectuur om twee redenen te gebruiken, losse koppeling en schaalbaarheid.

Losse koppeling

Wat de ontwikkeling van software betreft, is losse koppeling het concept om verschillende componenten binnen uw toepassing zo apart mogelijk te houden, zodat zij zo min mogelijk van elkaar weten. Door deze scheiding kunnen ontwikkelaars zich meer richten op de functionaliteit van een systeem en minder op de interactie van verschillende componenten of delen van het systeem. Dit zorgt voor eenvoudigere veranderingen in functionaliteit en testen van verschillende componenten.

schaalbaarheid

Schaalbaarheid heeft te maken met hoe een systeem kan groeien zonder voortdurend de hele oplossing opnieuw te moeten ontwerpen en opnieuw te ontwerpen. Als het om berichten gaat, als u een soort extra verwerking moet doen wanneer een bepaald bericht wordt gedetecteerd, wordt een nieuwe abonnee gemaakt om die functionaliteit af te handelen in plaats van een bestaand stuk code open te moeten maken en wijzigingen aan te brengen.

Laten we nu kijken hoe we deze extreem krachtige architectuur kunnen gebruiken in onze mobiele applicaties met Xamarin.

2. Berichten gebruiken in Xamarin.Forms

Het betreden van de wereld van messaging in Xamarin. Forms is eigenlijk vrij simpel nu we de basisbegrippen van messaging begrijpen. Alles wat we nu nodig hebben, is een construct om toegang te krijgen. Gelukkig voor ons is er maar één klasse waar we ons echt zorgen over moeten maken en dat is MessagingCenter. De MessagingCenter class is onderdeel van Xamarin.Forms en heeft methoden om ons te helpen met zowel het publiceren als abonneren op berichten. Laten we ze eens bekijken.

Publiceren

De eerste methode die we gaan bekijken in de MessagingCenter klasse is Sturen. Hoewel het concept in een berichtencontext is gepubliceerd, wordt de implementatie van Xamarin.Forms gebruikt Sturen. Er zijn twee versies van de Sturen methode die kan worden gebruikt om gegevens te publiceren.

  • MessagingCenter.Send(Zender van zender, stringbericht)
  • MessagingCenter.Send(Afzender van TSender, stringbericht, TArgs args)

Beide opties zijn generiek. Met de eerste kunt u de afzender van dit bericht opgeven en met de tweede kunt u ook een secundair argument, het payload-type, gebruiken.

Het is belangrijk om erop te wijzen dat de TArgs generieke parameter kan van elk type zijn. Het kan iets eenvoudigs zijn als een draad of zo complex als een aangepast type.

abonneren

Nu we begrijpen hoe te publiceren, of Sturen, berichten in het systeem, is het tijd voor iets om zich op te abonneren. Om dat te doen, zullen we de abonneren methode op de MessagingCenter klasse.

Vergelijkbaar met de twee versies van de Sturen methode, de abonneren methode heeft ook twee overbelastingen.

  • MessagingCenter.Subscribe(objectabonnee, stringboodschap, actie callback, TSender sender = null)
  • MessagingCenter.Subscribe(objectabonnee, stringboodschap, actie callback, TSender sender = null)

Voor de abonneren methoden, geven we aan wie de abonnee is. Meestal specificeren we dit deze voor de eerste parameter. De tweede parameter bevat dezelfde berichtnaam die is opgegeven in de Sturen methode, zodat we op de hoogte kunnen worden gesteld wanneer dat specifieke bericht is verzonden. De derde parameter is een generieke afgevaardigde die de afzender en mogelijk args accepteert, afhankelijk van de versie van de methode die wordt gebruikt. De gedelegeerde is een callback die wordt uitgevoerd wanneer een bericht van dit type wordt gepubliceerd. Eindelijk is een parameter nullable die specificeert welke TSender er moet op dit bericht worden geabonneerd. Het kan worden gelaten zoals nul om dit type bericht van een afzender te accepteren.

Geweldig, nu abonneren we ons op berichten, maar wat als we niet langer om bepaalde berichten geven? Goede vraag. Er is nog een methode om rekening mee te houden.

Afmelden

Een proces dat vaak over het hoofd wordt gezien in de berichtenwereld, is uitschrijven. Wanneer u in een zeer grote enterprise-klasse infrastructuur werkt, is het misschien niet zo belangrijk. Als u daarentegen in een kleinere omgeving werkt, zoals een telefoon, wordt deze belangrijker.

Hoewel het gebruik van de berichtenarchitectuur meer flexibiliteit en schaalbaarheid mogelijk maakt, zijn er nog steeds systeembronnen voor nodig. Vanwege dit kunnen we niet doorgaan met het oneindig vergroten van het aantal abonnees in een systeem. Als dat zo is, moeten we de middelen zo goed mogelijk respecteren. In Xamarin.Forms, is de manier waarop we dit doen door het te noemen Afmelden methode. Met deze methode kunnen we zeggen dat we ons niet langer bekommeren om een ​​bepaald bericht dat wordt gepubliceerd naar het systeem.

De Afmelden methode heeft ook twee overbelastingen.

  • MessagingCenter.Unsubscribe(objectabonnee, stringboodschap)
  • MessagingCenter.Unsubscribe(objectabonnee, stringboodschap)

U zult merken dat de generieke argumenten zich niet in de parameterlijst manifesteren. Alleen de ontwikkelaars hebben een goed idee over waarom precies, maar ik denk dat het waarschijnlijk meer een formaliteit is. Hoe dan ook, ik kies ervoor om consistent te zijn in al mijn oproepen naar Sturen, abonneren, en Afmelden, en gebruik dezelfde handtekeningen en argumenten om elke vorm van verwarring te elimineren.

Nu we de basisbegrippen van berichten begrijpen, is het tijd om een ​​eenvoudig voorbeeld te maken met behulp van deze ideeën.

3. Een voorbeeld maken

In dit voorbeeld maken we een eenvoudige Xamarin.Forms-app die alle drie de methoden van de MessagingCenter klasse die eerder in dit artikel is genoemd. De app zelf lijkt nogal onbelangrijk, maar het zal een handige illustratie zijn van hoe je deze concepten in de komende tijd in je apps kunt gebruiken.

Stap 1: maak een Xamarin.Forms-app

We beginnen met het maken van een nieuwe Xamarin.Forms-app. Om dit te bereiken, opent u eenvoudig Xamarin Studio (of Visual Studio) en selecteert u Bestand> Nieuwe oplossing. In de Nieuwe oplossing dialoogvenster, selecteert u de Mobiele apps sjabloonfamilie en kies een van de sjablonen. Ik zal het selecteren PCL versie, maar je zou het kunnen gebruiken Gedeeld project versie als je wilt.

Stap 2: voeg wat code toe

Zodra de oplossing is gemaakt, voegen we wat code toe. Maak in het gedeelde project een nieuwe klasse en noem deze Hoofdpagina. Dit is het scherm in de applicatie dat zowel de gebruikersinterface als de logica zal bevatten. Dit kan natuurlijk worden uitgesplitst in meer logische stukken, maar deze applicatie is eenvoudig genoeg dat ik het niet nodig vond.

Vervang de inhoud van de MainPage.cs bestand met het volgende:

systeem gebruiken; gebruikmakend van Xamarin.Forms; met behulp van System.Collections.Generic; met behulp van System.Collections.ObjectModel; naamruimte MessagingSample public class MainPage: ContentPage private lijst _eventTimes; private bool _isSubscribed = false; private ListView _eventList; public MainPage () _eventTimes = nieuwe lijst (); var clearButton = new Button Text = "Clear"; clearButton.Clicked + = (afzender, e) => _eventTimes.Clear (); UpdateList (); ; var publishButton = new Button Text = "Publish"; publishButton.Clicked + = (afzender, e) => MessagingCenter.Send(dit, "boom", DateTime.Now); ; var subUnsubButton = nieuwe knop Text = "Subscribe"; subUnsubButton.Clicked + = (afzender, e) => _isSubcribed =! _isSubscribed; if (_isSubcribed) subUnsubButton.Text = "Afmelden"; MessagingCenter.Subscribe(dit, "boom", (pagina, tijd) => _eventTimes.Add (time.ToString ()); UpdateList (););  else subUnsubButton.Text = "Abonneren"; MessagingCenter.Unsubscribe(dit, "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; Inhoud = mainStackLayout;  private void UpdateList () _eventList.ItemsSource = new ObservableCollection (_EventTimes); 

Dit lijkt in eerste instantie misschien een beetje overweldigend, maar ik verzeker u dat het vrij eenvoudig is. Er zijn drie knoppen:

  • Publiceren: gebruikt de Sturen methode om een ​​bericht met een naam te publiceren boom
  • Abonneer Meld af: Hiermee wordt de pagina omgedraaid van waarop u bent geabonneerd / afgemeld boom
  • Duidelijk: wist de inhoud van Lijstweergave

Het uitgangspunt van deze toepassing is dat deze start in een niet-geabonneerde staat. In deze toestand, als u op de Publiceren knop lijkt er niets te gebeuren. We weten dat het boom bericht wordt gepubliceerd, maar omdat er geen abonnees zijn, gebeurt er niets.

Zodra u op tikt abonneren knop, de toepassing gaat naar een geabonneerde staat waarin hij nu naar de boom bericht. Wanneer dit bericht wordt ontvangen, wordt een nieuw bericht geplaatst Datum Tijd waarde in de _eventTimes verzameling, die wordt bijgewerkt in de _evenementenlijst Lijstweergave via een ObservableCollection.

De rest van de code is slechts enkele basisopmaak en -afstand. 

Stap 3: bouwen en uitvoeren

Het uitvoeren van de applicatie in de iOS Simulator zou er ongeveer zo uit moeten zien:

Evenzo zou de initiële status in de Android Emulator er als volgt uit moeten zien:

Na het tikken op de abonneren knop en het publiceren van een paar berichten, zou u moeten beginnen om de gebruikersinterface te zien die wordt bijgewerkt door wat te krijgen Datum Tijd waarden in de Lijstweergave.

Conclusie

Daar heb je het. U hebt met succes een Xamarin.Forms-app gemaakt die gebruikmaakt van een architectuur die doorgaans is gereserveerd voor grote ondernemingen. Je zou op dit moment behoorlijk opgewonden moeten zijn, omdat je nu een nieuwe tool in je gereedschapsriem hebt waarmee je zeer schaalbare en flexibele kunt maken - om maar te zwijgen van testbare applicaties die in de hand van de eindgebruiker kunnen draaien. En dat kan de deur openen naar veel meer mogelijkheden.