[ Pobierz całość w formacie PDF ]
.Odpowiedni przyk ad klienta i us ugi wraz z definicjami typówpomocniczych pokazano na listingu 4.9.Listing 4.9.Bezpo rednie przekazywanie identyfikatorów instancji[DataContract]class SomeKey : IEquatable{.}Us ugi trwa e 207Poleć ksi kKup ksi k [ServiceContract]interface IMyContract{[OperationContract]void MyMethod(SomeKey instanceId);}// Typ pomocniczy u ywany przez us ug do uzyskiwania swojego stanu[Serializable]struct MyState{.}[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]class MyService : IMyContract{public void MyMethod(SomeKey instanceId){GetState(instanceId);DoWork();SaveState(instanceId);}void DoWork(){.}// Uzyskuje i ustawia MyState na podstawie pami ci trwa ejvoid GetState(SomeKey instanceId){.}void SaveState(SomeKey instanceId){.}}Aby lepiej zrozumie kod z listingu 4.9, warto przyjrze si listingowi 4.10 obs uguj cemukieszonkowy kalkulator z pami ci trwa w formie pliku dyskowego.Listing 4.10.Kalkulator z jawnie przekazywanym identyfikatorem instancji[ServiceContract]interface ICalculator{[OperationContract]double Add(double number1,double number2);/* Pozosta e dzia ania arytmetyczne */// Operacje zwi zane z zarz dzaniem pami ci[OperationContract]void MemoryStore(string instanceId,double number);[OperationContract]void MemoryClear(string instanceId);}[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]class MyCalculator : ICalculator{static IInstanceStore Memory =new FileInstanceStore(Settings.Default.MemoryFileName);public double Add(double number1,double number2){208 Rozdzia 4.Zarz dzanie instancjamiPoleć ksi kKup ksi k return number1 + number2;}public void MemoryStore(string instanceId,double number){lock(typeof(MyCalculator)){Memory[instanceId] = number;}}public void MemoryClear(string instanceId){lock(typeof(MyCalculator)){Memory.RemoveInstance(instanceId);}}// Dalsza cz implementacji&}W kodzie z listingu 4.10 nazwa pliku jest dost pna we wszystkich w a ciwo ciach projektuw klasie Settings.Wszystkie instancje us ugi kalkulatora u ywaj tej samej pami ci statycznejreprezentowanej przez klas FileInstanceStore.Kalkulator synchronizuje dost pdo tej pami ci w ka dej operacji i we wszystkich instancjach, blokuj c typ us ugi.Usuni ciezawarto ci pami ci jest traktowane przez kalkulator jako sygna ko ca przep ywu pracy, poktórym us uga czy ci swój stan w pami ci trwa ej.Identyfikatory instancji w nag ówkachZamiast bezpo rednio przekazywa identyfikator instancji, klient mo e umie ci ten identyfi-kator w nag ówkach komunikatów.Stosowanie nag ówków komunikatów jako techniki prze-kazywania dodatkowych parametrów na potrzeby niestandardowych kontekstów zostanieszczegó owo omówione w dodatku B.W tym przypadku klient u ywa klasy po rednikaHeaderClientBase, a us uga mo e odczyta identyfikator instancji za pomoc odpowied-nich operacji opracowanej przeze mnie klasy pomocniczej GenericContext.Us uga mo e albou ywa klasy GenericContext w jej oryginalnej formie, albo opakowa j w ramach dedyko-wanego kontekstu.Ogólny wzorzec stosowania tej techniki pokazano na listingu 4.11.Listing 4.11.Przekazywanie identyfikatorów instancji w nag ówkach komunikatów[ServiceContract]interface IMyContract{[OperationContract]void MyMethod();}// Strona klientaclass MyContractClient : HeaderClientBase,IMyContract{public MyContractClient(SomeKey instanceId){}public MyContractClient(SomeKey instanceId,string endpointName) :base(instanceId,endpointName){}Us ugi trwa e 209Poleć ksi kKup ksi k // Pozosta e konstruktory&public void MyMethod(){Channel.MyMethod();}}// Strona us ugi[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]class MyService : IMyContract{public void MyMethod(){SomeKey instanceId = GenericContext.Current.Value;.}// Dalsza cz taka sama jak na listingu 4.9}Tak e tym razem, aby schemat z listingu 4.11 nie by zbyt abstrakcyjny, warto przeanalizo-wa listing 4.12 z kodem kalkulatora stosuj cego technik przekazywania identyfikatoróww formie nag ówków komunikatów.Listing 4.12 [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • elanor-witch.opx.pl
  •