Remoting opgave  R04

 

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)

 

 

Opgave

 

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.