Globalne promjenjive u LightSwitch

Često postoji potreba da u aplikacijama koje razvijamo koristimo globalne promjenjive. Tačnije, da promjenjivoj koja će biti vidljiva u cijelog aplikaciji postavimo vrijednost na početku životnog vijeka pokrenutog programa i da tu vrijednost koristimo na više mjesta u aplikaciji dok god ne izađemo iz aplikacije. Ukoliko želimo da globalnu promjenjivu iskoristimo i za naredne instance aplikacije, onda je potrebno na neki način sačuvati tu vrijednost kako bi je bilo moguće iskoristiti prilikom narednog pokretanja aplikacije.

Takođe, pored globalne promjenjive kao spremnika jedne pojedinačne promjenjive možemo korististi i klasu koja sadrži metode koje će biti vidljive u cijelog aplikaciji. Na taj način izbjegavamo da definišemo jednu te istu metodu na svim mjestima gdje je to potrebno nego samo vršimo poziv jedne metode koja vrši odgovarajuću funkcionalnost.

Na osnovu predočenog, razmotrićemo dva osnovna globalna tipa u LightSwitch aplikaciji:

  • Globalna promjenjiva
  • Globalna klasa

Globalna promjenjiva

Globalnu promjenjivu možemo kreirati kao člana klase Application. Postavlja se pitanje kako doći doći klase Application u LightSwitch? Dva moguća načina su pomoću:

  • File View
  • Screen Navigation

File View: Prvi korak je da se koristi File View u Solution Explorer. Odabere se aktivni projekat te se odasbere opcija File View. Potom u ovom pregledu odabrati Client –> UserCode – > Application.cs

FileView

Screen Navigation: Drugi način je preko Screen Navigation podešavanja za LightSwitch projekat. Odabrati aktivni projekat i opciju Properties:

ProjectProperties

te u Screen Navigation tabu odabrati link Click here to view application code:

ScreenNavigation

Sledeće što je potrebno odraditi je deklarisanje promjenjive i postavljanje na default vrijednost. Kreiraćemo dvije promjenjive, jednu za trenutnu godinu a drugu za trenutno ulogovanog korisnika u aplikaciji:

public partial class Application
{
  public int CurrentYear { get; set; }
  public string CurrentUserName { get; set; }

  partial void Application_Initialize()
  {
    CurrentYear = DateTime.Now.Year;
  }

  partial void Application_LoggedIn()
  {
    if (this.User.IsAuthenticated)
    {
      CurrentUserName = Application.Current.User.Name;
    }
  }
}

Prilikom pokretanja LightSwitch aplikacije, prvo se izvršava Initialize metoda u okviru Application klase pri čemu postavljamo vrijednost promjenjive za trenutnu godinu. Kako u ovom trenutku nije poznat korisnik koji se logovao u aplikaciju, koristimo metodu LoggedIn koja se pokreće pošto se korisnik identifikovao putem User Name i Password (ovo važi ukoliko je u pitanju Forms autentifikacija). Takođe u metodi LoggedIn dodatno koristimo provjeru da li je korisnik uspješno identifikovan u aplikaciji (IsAuthenticated).

Definisane globalne promjenjive je moguće koristiti bilo gdje u okviru funkcionalnosti koje se izvršavaju na klijentskoj strani (ekrani-Screens), kao na primjer u okviru metode InitializeDataWorkspace za bilo koji ekran ili u okviru dugmeta na ekranu.

Na osnovu prikazanog primjera setovanje globalnih promjenjivih se vrši svaki put prilikom pokretanja aplikacije.

Jedna od mogućnosti je da definišemo entitet AppSetting u kojem bi čuvali informacije o vrijednostima za određene parametre koje možemo kasnije upotrijebiti u aplikaciji. Tada bi u okviru metode Application_Initialize pristupili entitetu AppSetting koji sadrži samo jedan slog (id=1) i sa onoliko parametara koliko nam je potrebno u aplikaciji (npr.: trenutna aktivna godina sa kojojm radimo u aplikaciji, naziv preduzeća za potrebe izvještaja za memorandum, trenutni direktor preduzeća itd). U tom slučaju entitet bi imao sledeću definiciju:

AppSetting

Kako je cilj da entitet AppSetting ima samo jedan slog, možemo onemogućiti unos još jednog sloga koristeći Validate metodu za entitet AppSetting:

Validate

partial void AppSettings_Validate(AppSetting entity, EntitySetValidationResultsBuilder results)
{
  if (this.AppSettings.GetQuery().Execute().Count() > 0)
  {
    results.AddEntityError("There can be only 1 Application Settings");
  }
}

Metoda Validate će omogućiti unos samo jednog sloga u AppSetting jer će funkcija AppSettings.GetQuery().Execute().Count() prilikom unosa prvog sloga vratiti vrijednost 0 (nula) dok će prilikom pokušaja unosa drugog sloga vratiti grešku:

ValidationError

Nakon provjere, možemo preći na setovanje podataka u globalnu promjenjivu (globalna promjenjiva je tipa entiteta AppSetting):

public partial class Application
{
  public AppSetting appsetting { get; set; }

  partial void Application_Initialize()
  {
    using (var dataWorkspace = this.CreateDataWorkspace())
    {
      appsetting = dataWorkspace.ApplicationData.AppSettings.SingleOrDefault();
    }
  }
}

Promjenjivu možemo koristiti bilo gdje na klijentskoj strani prozivanjem appsetting promjenjive koja je tipa AppSetting i koja ima članove Director, FirmName i Year.

appsettvariable

Podatak iz globalne promjenjive možemo prikazati i na sledeći način:

this.ShowMessageBox(this.Application.appsetting.FirmName);

Pored kreiranja samo jedne promjenjive tipa entiteta, druga varijanta je da smo mogli kreirati onoliko globalnih promjenjivih koliko imamo polja u enitetu AppSetting i onda setovati vrijednosti za svaku od promjenjivih.

Globalna klasa

Za razliku od globalnih promjenjivih koje su prikladne za čuvanje informacija o podacima, globalne klase su prikladnije za kreiranje klasa ili metoda koje se mogu koristiti kako na klijentskoj tako i na serverskoj strani.

Globalne klase se mogu definisati u okviru Common dijelu projekta (File View – > Common –> UserCode):

Common

Potom desnim dugmetom miša dodajte novu klasu sa Add –> Class. Odaberite Class sa spiska šablona i klasi dajte naziv HelperClass.cs. Dodajte naredni programski kod:

using System;

namespace LightSwitchApplication.UserCode
{
  public static class HelperClass
  {
    public static string Method1(string a, string b)
    {
      return a + " " + b;
    }
  }
}

Kreirali smo metodu sa nazivom Method1 koja radi prosto sabiranje dva stringa na osnovu ulaznih parametara. Da bi metodu Method1 mogli koristiti u kodu, prvo je potrebno da se referenciramo na ovu klasu sa:

using LightSwitchApplication.UserCode;

a potom da pozovemo željenu metodu prosljeđujući joj parametre:

HelperClass.Method1("value1","value2");

Ono što je zgodno sa definisanim korisničkim klasama na prethodno opisani način je da su ove statičke klase definisane u Common sekciji vidljive i na serverskoj strani. Pod serverskom stranom podrazumijevamo kod koji se izvršava na serveru (npr. svaka metoda vezana za entitet). Najlakše možemo saznati gdje se metoda izvršava tako što npr. za entitet odaberemo metodu i sačekamo da se prikaže opis metode:

ServerMethod

Na serverskoj strani je potrebno kao za klijentsku stranu referencirati se na globalnu klasu i potom na željenom mjestu pozvati željenu metodu HelperClass.Method1.

Zaključak

Globalne promjenjive kao i globalne klase koriste osnovnu paradigmu:

  • definiši jednom
  • koristi više puta

Na osnovu prethodnih primjera je pokazano na koji način se mogu definisati globalne promjenjive za smještanje podataka kao i globalne klase koje mogu sadržavati jednu ili više metode koje se mogu koristiti kako na klijentskoj tako i na serverskoj strani. Na ovaj način se smanjuje redudancija programskog koda, kod postaje čitljiviji i što je najbitnije lakši za održavanje.

About Spaso Lazarevic

Spaso Lazarevic is Senior Software Developer working with Microsoft technologies. Leader of .NET User Group Bijeljina, speaker at Microsoft events, writter and blogger. Microsoft MVP for Visual C#.
This entry was posted in Programming, Step by Step and tagged , . Bookmark the permalink.

3 Responses to Globalne promjenjive u LightSwitch

  1. Kivito says:

    odlican clanak Spaso, ovo ce mi i vise nego dobro doci.. samo tako dalje!
    pozdrav!

    Kivito

    • Hvala Kivito. Posebno prija kada znam da cestitka dolazi od covjeka koji je izvjesno vrijeme medju prvi 10 Top answerers na MSDN LightSwitch forumu. Veliki pozdrav i hvala na podrsci. Jel’ ides na WD11?

  2. Kivito says:

    heh, trudim se, iako sam i ja pocetnik, pa slijedim onu “pomozi mi – pomoci cu ti”..😉
    a na zalost necu na WD11, jos nisam u toj bransi, za sada vremena za Lightswitch i ucenje imam samo uvece, ostatak dana je u znaku drugog posla.. no svakako zeljno iscekujem vNext betu..🙂

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s