I denne opgave skal du se prøve at implementere en anden løsning baseret på en modem med de samme 3 objekter som i fremkom i opgave R01,R02 og R03
Denne gang skal ingen af disse objekter være remote.
Der skal i stedet laves et remote VareFacede objekt, som skal aktiveres fra klienten (CAO) , således at hver klient kan få sit eget objekt, der kan
bruges som serverbaseret session (session mønster).
I denne løsning skal såvel vare- som varebevægelses data overføres som serialiserede data,
idet der for vare-data skal laves en ny klasse VareDTO, som kan bruges som "pakke" med varedata uden forretningslogik.
For bevægelserne er det ikke nødvendigt, da de den eksisterende udformning opfylder formålet i sig selv.
VareDTO skal have følgende properties (med tilhørende underliggende felter):
int Varenr {get;}
string Betegnelse {get;set;}
int AntalPåLager {get;}
float SalgsEnhedsPris {get;set;}
Desuden en constructor, der kan bruges til at initiere de tilhørende felter
VareFacade skal have følgende metoder
VareDTO[] GetAlleVarerUdenBevægelser (); // VareDTO opbygges og returneres for alle varer
void FindVare (int varenr); // skal finde varen og huske den som aktuel på serveren
VareDTO GetAktuelVare (); // VareDTO opbygges ud serverens aktuelle vare
IVarebevaegelse[] GetAktuelVarebevægelser (); // Bevægelser for serverens aktuelle vare
void RegistrerVarerSolgtPåAktuelVare (int antal); // registrer på serverens aktuelle vare
void RegistrerVarerIndkøbtPåAktuelVare(int antal); // registrer på serverens aktuelle vare
void RetAktuelVare (VareDTO varedata); // Skal ændre betegnelse og salgsenhedspris ud fra det VareDTO der sendes med (tilbage)fra klienten
VareFacade skal kunne "fastholde" den vare, der arbejdes med, idet den skal holdes på serveren.
For at have en fælles varekartotek alle klienterne kan man have en klasse med en static variabel med et VareKatalog og en get-metode
der ved første kald opretter et Varekatalog-objekt og fylder testdata i dette.
Du kan lave en ny klasse med noget der ligner nedenstående eller pladsere disse static elementer i VareFacade
........
private static IVarekatalog varekataloget;
private static object katalogLås = new object();
public static IVarekatalog GetVarekatalog ()
{
lock (katalogLås)
{
if (varekataloget == null)
{
varekataloget = new Varekatalog();
varekataloget.OpretVare (.........); // fyld op med testdata
..............................................
}
}
return varekataloget;
}
Du kan nu bruge klassemetoden GetVarekatalog inde i VareFacede objektet til at skaffe dig et varekatalog og der vil kun være eet varekatalog (singleton).
Bemærk: Når
klienten skal deserialisere (Varebevægelse) objekter skal klassen kendes.
Det er således nødvendigt, at der i klient projektet er en reference til det
library (projekt / dll) hvor klassen er defineret (Varebevægelse og VareDTO)
a) Programmer en remote VareFacade, VareDTO klassen - Vare og Varekatalog skal ikke være remote.
b) Programmer en server, der kan registrere VareFacade som en CAO tjeneste.
c) Programmer
en klient, der kan aktivere remote objektet på serveren som Client Activated
Object og som
afprøver metoderne på VareFacade objektet.
d) Prøv at køre med flere klienter.
e) Overvej
hvad der skal til får at man kan låse en vare for opdatering fra VareFacade
objektet, således at kun een klient kan "holde" på varen og ændre den af gangen,
idet der kan foretages flere ændringer på samme vare fra klienten.