Beste fremgangsmåter: Å bygge kantete tjenester ved å bruke fasadedesignmønster for komplekse systemer

Kantete tjenester

Angular services-konseptet forveksler alltid nybegynnere med serversiden REST-tjenester. Hvis du fremdeles ikke er sikker på hva det er, vil jeg anbefale deg å lese Angular-dokumentasjon

Angular Services har ansvar for å levere applikasjonsdata / forretningslogikk til komponenter. Komponenter skal ta / levere data til service og fungere som lim mellom syn og service. Det er tjenesten som kan bestemme om de skal gi spottdata eller gå til server og hente data fra database / fil / en annen tjeneste (r) osv.

Ideelt sett bør tjenester være funksjonsorienterte. Du har valg om å bygge en gigantisk serviceklasse eller mikrotjenestesamling. Ved første tilnærming skal det kun være en tjeneste som skal inneholde all forretningslogikk og skal leveres via Angular Dependency Injection i alle komponenter i systemet. Problemet med denne tilnærmingen er at gigantiske serviceklasser skal bli oppblåst til slutt ledende ytelsesproblem. Hver komponent skal få injisert service og funksjonalitet som ikke er nødvendig for forbrukerkomponenten i det hele tatt. Synes du det er bra?

I den andre tilnærmingen (fulgt bredt) blir funksjonsspesifikke mikrotjenester bygget. For eksempel, hvis systemet ditt har innloggings-, SignUp-, Dashboard-komponenter, må du bygge LoginService, SignUpService, DashboardService og så videre. Hver tjeneste skal inneholde funksjonalitet som kreves for spesifikk målrettet komponent. Nå ser dette designet bra ut, er det ikke?

Problem?

Mens du bygger en stor og kompleks applikasjon med én side ved bruk av Angular, skal du snart ende opp med hundretusener av komponentklasser. Når det er sagt, skal du få injisert lignende antall Angular-tjenester. Hva er problemet her?

Uansett hvor god navnekonvensjon du har fulgt for bygningskomponenter og tjenester, skal det være tid til å finne ut spesifikt navn på tjeneste for spesifikk klasse. Du kan også ende opp med å skrive dupliserte serviceklasser med litt annet navn på samme komponent enn andre teambyggede. Hvis du jobber med Extreme Programming-modellen, skal frontend-utviklerne fortsette å bytte mellom moduler / komponenter / funksjoner. Det skal ikke ta mye tid for dem å finne ut komponenter og tjenester tilknyttet.

Løsning

Vi kan løse dette problemet ved hjelp av Fasadedesignmønster.

Fasadedesignmønster

Facade diskuterer innkapsling av et komplekst delsystem i et enkelt grensesnittobjekt. Dette reduserer læringskurven som er nødvendig for å kunne utnytte delsystemet. Det fremmer også å koble av undersystemet fra potensielt mange kunder.

Fasade-objektet skal være en ganske enkel talsmann eller tilrettelegger. Det skal ikke bli et allvitende orakel eller "gud" -objekt.

Her er den gode lesningen for fasade-designmønster i detaljer

Fasadedesignmønster

Fasade i aksjon med Angular Services

Jeg vil anbefale følgende trinn for å bygge kantete tjenester ved hjelp av fasademønster:

Definer alle dine Angular-tjenester i henhold til virksomhetens krav og / eller fortsett å legge til mer etter behov.

Lag en tjeneste som heter “FacadeService” (bruk gjerne noe annet navn her)

Lag en delt NgModule og gi alle Angular-tjenester

Gjennomføring av fasadetjeneste

Vår viktigste diskusjon skal være rundt “FacadeService” -tjenesten.

Vi har diskutert om to tilnærminger giganttjeneste kontra mikrotjeneste. Vi har sett fordeler og ulemper. Den beste løsningen er å slå sammen begge to for å lage service Fasade. Nå skal FacadeService-klassen være en gudsklasse, men ikke ha faktisk funksjonalitet, men en innpakning over faktiske tjenester.

FacadeService skal samle alle kantete tjenester innenfor nevnte system. En enkel tilnærming er å injisere alle tjenester i FacadeService i konstruktør. Men hvis vi gjør det, vil vi ende opp med et lignende problem som for gigantisk serviceklasse.

Smartere måte ville være å samle alle Angular-tjenester i FacadeService og løse forekomstene deres fra Angular DI i “eiendom” -tilgang.

La oss diskutere AccountService-bruk.

Vi har en eiendom definert kalt accountService i FacadeService. getOrderList () og getAddress () -funksjonene til FacadeService fungerer som innpakning for faktiske metoder for accountService.

Hver gang accountService-medlemmet åpnes, skal dets eiendomsblokk utføres. Inside get block, sjekker vi om sikkerhetskopieringsfeltet _accountService er øyeblikkelig. Hvis ikke, ber vi Angular Dependency Injector om å løse en instans for oss.

For å få tilgang til Angular DI-motoren, må vi injisere Inejctor Angulars innebygde service i FacadeService-konstruktøren. injector.get () skal spørre Angular's DI-motor for å løse forespurte serviceinstanser hvis den leveres. (Husk SharedModule der vi har levert alle tjenester?)

Hvis du har observert nøye, har vi implementert Singleton designmønster, så vel som i get-eiendomsdelen av accountService-egenskapen.

Forbruk FacadeService innsiden komponent (er)

Vi har AccountService samlet i FacadeService og den er klar til å konsumeres i OrderComponent og AddressComponent.

Fullfører opp gjenværende system

På den samme merknaden om implementering av accountService, kan du fullføre implementeringen av andre Angular-tjenester i FacadeService.

Implementering av fasadedesignmønster i Angular Services

Live demo:

GitHub-lageret:

Sammendrag

Fasadedesignmønster hjelper oss å bygge komplekse kantete applikasjoner ved å gi en forenklet tilgang til mange komplekse kantete mikrotjenester.

Jubel!