A C# programozási nyelv

WPF és WCF

Windows Presentation Foundation

A .NET 3.0-s keretrendszer egyik grafikus alrendszere, amelyben a XAML (Extensible Application Markup Language, ejtsd: ”zeml”, kb.: kiterjeszthető alkalmazás-leíró nyelv) nyelv segítségével grafikus felhasználói felületet építhetünk. Windows XP SP2 alá telepíthető, vagy későbbi Microsoft operációs rendszereknek alapból része. Következetes programozási modellt ad az alkalmazásfejlesztőknek szétválasztva a megjelenítést az üzleti logikától. A kimenete egyaránt lehet futtatható állomány vagy webes szerveren futó alkalmazás – XBAP (XAML Browser Application). A célja egységesíteni a webes és Windows Formos programok megjelenítési formáit, mint UI elemek, dokumentumok, tipográfia, vektoros vagy raszteres grafikai elemek, animációk, hang és videó fájlok. A WPF menedzselt kóddal érhető el, de az tulajdonképpen egy MIL (Media Integration Layer)-nek nevezett rétegen keresztül DirectX-es hívásokkal operál, lerendereli térben a WPF által nyújtott látványt. Különböző komponensei felelősek az objektumok értékeinek értelmezéséről, beállításáról, eseménykezelésről, megjelenés (layout) vezérléséről, az adatkötésről. A WPF-es objektumok tulajdonságainak megváltozása a rájuk kötött eseménykezelőkön keresztül „magától” végzi el a felhasználói felület frissítését. Ez lehetővé teszi a deklaratív XAML leíró nyelv használatát, attribútumok közvetlen kötését WPF-es osztályokhoz, tulajdonságokhoz. Az UI részei a Visual osztály elemei, ezek csúcsokként kerülnek be egy felépítő fának (composition tree) nevezett hierarchiába, a megjelenítési attribútumaikkal, pl. a megjelenítéskor rajtuk alkalmazandó grafikus transzformációkkal. Így az egész felhasználói felület a felépítő fa csúcsaiként ábrázolható. A MIL ezt a fát bejárva rajzol akár hardveres gyorsítással a képernyőn megjelenő felületre, térben hátulról előre haladva, értelmezve az átlátszóságot. Az animációk effektek (pl. dropshadows – árnyék vetés, blurring – elhomályosítás) tulajdonságokra alkalmazásával jönnek létre, megadott időtartammal, kezdő és befejezési időponttal. Az animálást a MIL végzi a fa köztes időpontokban történő módosításával. A WPF alkalmazások két szálon futnak, egyikük kezeli a felhasználói felület elemeit, a másik a rajzolással foglalkozik. A UI szál Dispatcher-e végrehajtási sort kezel a változtatásokról, ezeket prioritásuk alapján időbeli sorrendben hajtja végre. A megjelenítésért felelős szál két fő folyamata a Measure és az Arrange. A Measure (mérés) fázisban rekurzívan lekérdezésre kerülnek az objektumok helyfoglalásának méretei, az Arrange fázisban a gyerek elemek rekurzívan elrendeződnek a szülőktől átvett layout modell alapján. A WPF vektor alapú megjelenítésének köszönhetően veszteségmentesen történhet az átméretezés, nagyítás, kétdimenziós felületek 3D-s vetítése natív módon. WPF-es kódban futtatható Windows API kód és fordítva, valamint korábbi Windows Forms-os elemek is az ElementHost és WindowsFormsHost osztályokon keresztül. Adatkötést lehet létrehozni megfelelő tulajdonságokra, a frissítés szempontjából egy vagy kétirányú, akár LINQ-es adatforrásból is. A Windows Formsból ismert Controlok sablonok alapján teljesen felüldefiniálhatók megjelenésükben, akár további controlokat is tartalmazhatnak. Szélsőséges esetben egy szövegbeviteli mezőben futtatható egy videófájl. A DocumentReader osztállyal lapozható, változtatható megjelenésű dokumentum-olvasót lehet betölteni az alkalmazásunkba. A Microsoft Silverlight a WPF speciális, csak webes felületen futó része, a Flash konkurenciájának szánta a Microsoft, így az platformfüggetlen, XAML-t használ, de a 3D-s megjelenítést nem támogatja.

WPF a gyakorlatban

A WPF a Visual Studio 2008 fejlesztőkörnyezetben jelent meg, sima vagy webes alkalmazásként. A létrehozható új projektek között Visual C#?Windows?WPF Application vagy WPF Browser Application pontnál lehet ilyen programot létrehozni. A VS 2008-ban megjelent új projekttípus Ugyanúgy húzd és ejtsd módszerrel helyezhetők a grafikus felületre controlok, mint egy sima Windows Forms alkalmazásnál. Az újdonság a CIDER, a WPF-es szerkesztő rész, ezen a generált kód a megjelenített felület alatt található. WPF szerkesztése A grafikus felület, azaz a XAML kód a példánkban Window1.xaml fájlban generálódik, a hozzá kapcsolt C# kód a Window1.xaml.cs-be kerülhet. Ilyen lehet például egy gomb lenyomásának eseménykezelő függvénye. A toolbox-ról egy gombot helyezve a felületünkre, azon kettőt kattintva létrehozhatunk egy üres kattintás-eseménykezelőt, amibe elhelyezhetjük a C# kódunkat. Eseménykezelő függvény XAML-ben A következő kódrészlet például egy RichTextBox típusú RTB szövegdoboz tartalmát menti ki a megadott elérési útvonalon található fájlba:
private void button1_Click(object sender, RoutedEventArgs e) { CommonSaveFileDialog saveFile = new CommonSaveFileDialog(); FileStream xamlFile = null; saveFile.EnableMiniMode = true; try { saveFile.ShowDialog(); if (saveFile.FileName == String.Empty) return; xamlFile = new FileStream(saveFile.FileName, FileMode.Create); } catch (Exception exc) { System.Windows.MessageBox.Show(exc.Message); return; } FlowDocument doc = RTB.Document; XamlWriter.Save(doc, xamlFile); xamlFile.Close(); }
Annak érzékeltetésére, hogy „kód” nélkül is lehet XAML-ben programozni álljon itt egy kódrészlet, ami egy stílust határoz meg a TreeViewItem típusú objektumokra. Ezen a stíluson belül található egy trigger, ami egy kvázi eseménykezelő, az egér elem fölé kerülése esetén sötétkék színnel fogja „beragyogni” annak tartalmát.

Windows Communication Foundation

A WCF egy programozói keretrendszer egymással kommunikáló alkalmazások kivitelezésére, amely egyesíti a .NET 2.0-s keretrendszer kommunikációs modelljeit, úgyis mint a webszolgáltatásokat (Web Service), a Remotingot (távoli alkalmazások, azok objektumainak hálózaton történő összekapcsolása a kód újraírása nélkül), az elosztott tranzakciókat és az aszinkron kommunikációt (Message Queues). A WCF kezeli a SOAP üzeneteket, így kompatibilis minden SOAP XML bemenetet kezelni képes folyamattal. A 3.5-ös frameworktől kezdve a WCF-ben megjelent a JSON sorosítás lehetősége, így AJAX-os weboldalak is kiszolgálhatók WCF-es alkalmazásokból. A szolgáltatás-orientált architektúra elveit követve támogatja az elosztott számításokat, ahol is szolgáltatásokat biztosít a fogyasztók részére. Egy kliens fogyaszthat több szolgáltatást, de több kliens is fogyaszthatja ugyanazt a szolgáltatást. Egy WCF szolgáltatás három részből áll: egy Service osztályból – ez implementálja a nyújtott szolgáltatást, a szolgáltatás környezetéből és egy vagy több végpontból (endpoint), amihez kapcsolódhatnak a kliens alkalmazások. A Service-el kommunikálni a végpontokon át lehet, amik az ún. szerződésükben meghatározott Service függvényeket teszik elérhetővé a kliensek felé. A végpontok meghatároznak egy kötést (binding), azaz a kommunikáció módját a Service és a kliens között. WCF szolgáltatást a Windows Activation Services-szel, a Microsoft IIS webszerver alatt futtatva vagy a ServiceHost osztályt használva parancssoros vagy Windows Forms programból lehet nyújtani. A WCF Service megvalósítása egy osztály, ami implementál egy szerződést – ez egy speciális jelölésű interfész, aminek függvényeivel rögzítettük a Service által nyújtott funkciókat. Ezek a függvények jellemzően ki és bemeneti üzeneteket fogadnak az adatszerződésnek megfelelően. Az adat és szolgáltatási szerződést .NET-es attribútumokkal adhatjuk meg az osztályban. WCF szolgáltatást a ServiceContract attribútummal jelölhetünk, illetve ilyen jelölésű interfészt valósíthatunk meg. Minden olyan függvényt, amit a kliens SOAP üzenetekkel hívhat meg OperationContract attribútummal látunk el. A szolgáltatás funkciói által kezelt adatokat meghatározó osztályokat vagy struktúrákat a DataContract attribútummal jelöljük. Egy Service több szolgáltatási szerződést is használhat, ha több így jelölt interfészt is megvalósít, valamint egy Oparation vagy ServiceContract attribútumú interfész hivatkozhat már létező szerződésre is. Minden szolgáltatási szerződéshez tartozik adatszerződés, akár implicit, akár explicit módon meghatározva. Implicit, ha primitív típusú paraméterekkel kommunikálnak Service függvényei. Ha bonyolultabb, struct vagy class típusú adatok a bemenő vagy visszatérési paraméterek, azokat jelölni kell a megfelelő attribútumokkal. A bonyolultabb struktúrájú adatok tagjait a DataMember attribútummal kell ellátni, csak ezek kerülnek átvitelre a Service és a kliens között. Az adatszerződés határozza meg az adatok sorosítását, visszaalakítását. Azonos adatszerződést implementálva akár más nyelven (VB, Java) írt osztályok is képesek ugyanazon adatok sorosítására, visszaalakítására. A ServiceBehavior és OperationBehavior attribútumok beállításával a szolgáltatás és azok funkcióinak viselkedései állíthatók. A ConcurrencyMode attribútummal jelölhetjük, hogy párhuzamosan engedünk-e több csatlakozást vagy sem. Az InstanceMode-dal megadhatjuk, hogy egy példány szolgáljon ki minden kérést, vagy minden kérésre új szolgáltatás példány induljon. Egy WCF kliens a Service-hez egy meghatározott szerződésű végponton keresztül csatlakozhat. A végpontnak van egy címe (URL), amin elérhető, valamint kötési tulajdonságai, amik meghatározzák az adatátvitel módját (kommunikációs protokollok, titkosítási módok). A kommunikáció a kliens és a Service között bármely, a szolgáltatás függvényei által biztosított RPC (távoli eljáráshívás) hívással történhet. A kapcsolódás egy proxy objektumon át valósul meg, ez kapcsolódik a végponthoz és láttatja egy objektumnak a szolgáltatást. A kapcsolat lehet szinkron, ilyenkor a kliens blokkolódik a kérés feldolgozásáig vagy aszinkron, nem blokkoló. Ilyenkor vagy üzenetsort (Message Queue) használunk, vagy a többszálú feldolgozást választhatjuk a proxy objektum megvalósításánál.

WCF a gyakorlatban

A következő C# kód egy példa a szerződés megadására.
[DataContract] public class Adatok { private string adat1; [DataMember] public string Adat1 { get { return adat1; } set { adat1 = value; } } }
Az Adat1 property elérhető lesz a kliens oldalon, mivel meg van jelölve a DataMember attribútummal. Új WCF szolgáltatás felvételéhez egy létező projektben válasszuk ki a Solution explorer ablakból a projektet, majd jobb egérkattintás után az Add?New item… ablakból a WCF Service-t. WCF Service, mint új felvehető elem Ha felvettük, az app.config fájlban meg fog jelenni egy új rész, a System.serviceModel, azon belül is a ServiceBehaviors és a Services, ez utóbbi már alap végpont bejegyzéseket is tartalmaz. A következő C# kód példa szolgáltatás szerződés megadására.
[ServiceContract] public interface IprobaService { [OperationContract] bool ProbaFuggveny(Adatok probadat); }
Az ilyen interfészt implementáló végpont osztályt hívhatjuk meg a kliens programunkból. A felkínált végpontokat a Tools menü WCF Configuration editor menüpontjából állíthatjuk be. Itt a solutionünkből kiválaszthatjuk az implementált végpont lefordított .dll fájlját. Ezután beállíthatjuk a kötési tulajdonságokat (HTTP, TCP, stb…) majd a végpont URL címét, viselkedését is. A WCF használatához futtatni kell párhuzamosan a szolgáltatást hosztoló programot és az azt hívó klienst.