Delphi - Multi-tier alkalmazásfejlesztés MIDAS komponensekkel

Multi-tier 4. rész

forráskód letöltése
Az előző cikkben megírtuk és regisztráltuk COM (Component Object Model) alkalmazásszerverünket, ebben a cikkben pedig egy DCOM (Distributed COM) kliens alkalmazást készítünk ehhez a COM-szerverhez A mellékelt példa megnyitásához szükséges, hogy a múlt héten készített szerver alkalmazás regisztrálva legyen, valamint az Interbase adatbázis kezelő fusson.

Néhány szó a COM és DCOM kliensekről:

A COM egy nyelvfüggetlen szoftverkomponens-modell, amit a Microsoft fejlesztett ki a szoftverkomponensek, alkalmazások, valamint a kliensek és szerverek közötti párbeszéd biztosítására.

A kliensalkalmazások a COM komponenseket az interfészeiken keresztül érhetik el, amint azt az előző cikkben láttuk az IAppServer és a típuskönyvtárak ismertetésénél.

Amennyiben a szerverünk és kliensünk ugyanazon a gépen található, a kommunikáció COM komponenseken keresztül történik, ha a szerver- és kliensalkalmazások egy hálózat más-más gépén helyezkednek el, akkor a kommunikációra a DCOM-ot használják. (Természetesen a DCOM esetén is elhelyezkedhet az összes réteg egy gépen, mint esetünkben.)

A COM és DCOM az alkalmazások közötti kommunikáció legközvetlenebb módja, amelyek egy külön processzben (DCOM esetén akár külön gépen) implementált objektumokat használnak interfészeiken keresztül. Ezért nincs szükségük külön futásidejű alkalmazásra a szerveren. A Win95 alaphelyzetben nem kezeli ugyan a DCOM-ot, de a Win95 DCOM támogatást külön tudjuk telepíteni (Dcom95.exe), mert megtalálható a Delphi5 \Install könyvtárában is, de letölthető a Microsoft web-lapjáról is.


A példaalkalmazás adatmoduljának elkészítése:

Példaprogramunkban egy adatmodulra (TDataModule) ráhelyeztünk a MIDAS-palettáról egy
TDCOMConnection komponenst.
Kattintsunk a ServerName property-re, és a listából válasszuk ki az előző példaprogramunk által regisztrált COM-szervert (Szerver.PeldaSzerver). Ha ezt elvégeztük, akkor a ServerGUID property-ben megjelenik a szerverünk GUID-je (Globally Unique Identifier, globális egyedi azonosító).

Amennyiben a COM-szerveralkalmazásunk - hálózati környezetben - egy másik gépen van regisztrálva, akkor a ComputerName tulajdonság melletti ellipszisgombra kattintva kiválaszthatjuk a megjelenő szerverlistában (Select Remote Server) a gépet, amelyen a szerveralkalmazásunk elhelyezkedik. Ha ezt a tulajdonságot üresen hagyjuk (alaphelyzet), akkor a TDCOMConnection komponens azt feltételezi, hogy az alkalmazásszerver a helyi gépünkön van.
A ComputerName tulajdonság TDCOMConnection-nél történő közvetlen megadása helyett az alkalmazásszerver tulajdonságainak és használatának beállításaira használhatjuk a DCOMCNFG.EXE (elosztott COM konfiguráció tulajdonságai) konfiguráló programot is, amely a Windows rendszerleíró adatbázisába írja be a DCOM tulajdonságait.
A DCOMCNFG.EXE-t elindítva, az Alkalmazások fülre kattintva (alapértelmezés) megjelennek a rendszerünkben regisztrált COM alkalmazások. Innen válasszuk ki a konfigurálni kívánt alkalmazást. A Tulajdonságok gombra kattintva megjelennek a kiválasztott alkalmazás tulajdonságai. A Hely fülre kattintva megadhatjuk, hogy az alkalmazás melyik gépen fusson. (Alapértelmezés az aktuális felhasználó számítógépe.) A Biztonság fülnél a hozzáférési-, indítási- és konfigurációs jogokat állíthatjuk be.
Az Azonosítás fülnél az alkalmazást futtató felhasználók adhatók meg, "Adott felhasználó" választása esetén annak felhasználói neve és jelszava (alapértelmezés az indító felhasználó). A Végpontok fülre kattintva a DCOM kiszolgáló kliensei által használható protokollokat és végpontokat állíthatjuk be. "Alapértelmezett végpontok használata" beállítás esetén a számítógépen telepített alapértelmezett rendszerprotokollokat használja.
A program induló ablakának három további füle az alapértelmezett biztonságot, az alapértelmezett protokollokat és tulajdonságokat állítja be. A tulajdonságok gombra kattintás után feltűnő - előzőekben ismertetett - tulajdonságok alapértelmezései az itt beállított értékek lesznek.

(A későbbi példákban majd látjuk, hogy a szervergépek helyének megadása és a rendelkezésre álló szervergépek kiválasztása a hálózaton hogyan támogatható a TSimpleObjectBroker komponens segítségével.)

A GUID-et, mint az előző példaprogram típuskönyvtárában láthattuk, a rendszer automatikusan generálja a típuskönyvtár előállításakor. Ez egy véletlenszerűen generált 128 bit-es azonosító, ami garantáltan egyedileg azonosítja az interfészt. Ilyen TLB-ket a hozzájuk tartozó GUID-ekkel jó néhányat találhatunk a WINDOWS\SYSTEM és egyéb könyvtárakban. Tanulmányozás céljából érdemes kikerestetni őket {Keresés paranccsal a Start menüből}, és a Delphi-vel megnyitni {File/Open menüpont, *.tlb}.

Állítsuk a LoginPrompt property-t False-ra, hogy az adatbázisba való bejelentkezéskor ne kelljen mindig megadni felhasználói nevet és a jelszót.
A ComputerName tulajdonságot most üresen hagytuk, ezért az alapértelmezés a Windows system registry-ben (rendszerleíró állományában) szereplő számítógépnév lesz, vagyis a saját gépünk. Amennyiben az alkalmazásszerver másik gépen helyezkedik el egy hálózatban, akkor kell a számítógépnevet kitölteni, vagy egy TSimpleObjectBroker-t használni, amely képes a hálózaton csatlakoztatott gépek listáját (TServerCollection) rendelkezésre bocsátani. (Ezt a lehetőséget később tárgyaljuk.)

Állítsuk a Connected property-t True-ra. Ha ez megvan, el kell indulnia a COM szerverünknek (Szerver-névvel meg kell jelennie a tálcán, mivel minimalizált méretű futásra van beállítva a Form-ja).

Helyezzünk egy TClientDataSet komponenst az adatmodulra (példánkban: cdsSzemelyek). A RemoteServer tulajdonságnál a listából válasszuk ki a DCOMConnection1-et, a ProviderName listájából pedig a dspSzemelyek-et. Az Active property-t állítsuk True-ra. Kattintsunk duplán a cdsSzemelyek komponensre, és a mezőszerkesztőben töltsük be az összes mezőt perzisztensként. Itt láthatjuk, hogy a kliens adathalmaz táblája (tblJelentkezes) is megjelenik beágyazva egy mezőként.
Helyezzünk az adatmodulra egy másik TClientDataSet komponenst (cdsJelentkezes), és állítsuk be hasonlóan az előzőhöz, de itt ProviderName-nek a dspJelentkezes-t válasszuk ki, valamint - mivel adatai detail-ként kell hogy megjelenjenek a cdsSzemelyek-be beágyazva - DataSetField tulajdonságának adjuk meg a cdsSzemelyektblJelentkezes-t. Adjuk hozzá ehhez is az összes mezőjét perzisztensként. Adjunk még az adatmodulunkhoz egy TDataSource komponenst (dsrSzemelyek) és irányítsuk a cdsSzemelyek-re.
Ezzel az adatmodulunkkal készen is vagyunk.

A TDCOMConnection eseményei:

OnGetUsername: Amennyiben a LoginPrompt tulajdonságot True-ra állítottuk, erre az eseményre írhatunk egy eseménykezelőt, amely akkor fut le, ha a login prompt-ban bejelentkezünk a TDCOMConnection ServerName tulajdonságában megnevezett szerverre. Az eseménykezelő UserName paraméterében megadhatjuk az alapértelmezett felhasználói nevet.

OnLogin: Akkor következik be, ha a LoginPrompt tulajdonságot True-ra állítottuk, és a szerverrel való kapcsolat már nyitott. Paraméterként megadhatjuk a Username-et és a Password-öt


BeforeConnect: Alkalmazás-specifikus feladatokat rendelhetünk az eseménykezelőhöz, amelyek a szerverre történő csatlakozás előtt futnak le.

AfterConnect: Alkalmazás-specifikus feladatokat rendelhetünk az eseménykezelőhöz, amelyek a szerverre történő csatlakozás után futnak le.

BeforeDisconnect: Alkalmazás-specifikus feladatokat rendelhetünk az eseménykezelőhöz, amelyek a szerverről történő lecsatlakozás előtt futnak le.

AfterDisconnect: Alkalmazás-specifikus feladatokat rendelhetünk az eseménykezelőhöz, amelyek a szerverről történő lecsatlakozás után futnak le.


Multi-tier cikksorozat