03. maj 2009 - 19:07Der er
6 kommentarer og 1 løsning
Beholde lav kobling med webservice?
Hej Eksperter!
Jeg sidder med et projekt hvor jeg skal lave et Receptionistsystem for et hotel. Klienten kommunikerer med serveren/databasen gennem en webservice denne udstiller. Til kommunikationen sendes flere klasser, f.eks. en Booking og en Guest, med som argumenter. Klienten opretter disse klasser vha. WSDL'en. Så langt så godt.
Klienten har jeg opdelt i 4 lag - GUI, Applikation, Domæne og Infrastruktur. Infrastruktur-laget sørger for kontakten med Webservicen, og er derfor den eneste der kender til de klasser som WSDL'en udstiller. Dette for at holde lav kobling til resten af systemet. Domæne-laget har sine egne repræsentationer af en Guest og en Booking.
Mit problem/spørgsmål: De førnævnte klasser (fx. Booking, Guest) som sendes ml. Infrastruktur-laget og webservicen skal laves om til Domænets repræsentationer af klasserne, men jeg ønsker ikke at andre end infrastruktur-laget har har direkte kenskab til Webservicen (gnm. service referencen), og ej heller at Infrastruktur-laget kender til Domæne-lagets klasser.
Hvordan får jeg på bedste vis lavet Webservice-klasserne om til Domæne-klasser og samtidig beholde lav kobling på tværs af systemet. Pt. har jeg en adapter/wrapper klasse ml. Infrastruktur og Domæne til at "wrappe" fra den ene til den anden repræsentation, men jeg synes der er flere ulemper ved dette, og kan ikke komme på en bedre løsning.
Findes der en standard/kotume til at løse dette problem?
Jeg plejer typisk at have et project for hvert lag, og så har jeg typisk nogle projects for common utils og lign på tværs af solutions og så et project til model klasser der går på tværs af lagene.
På den måde kan du tage de autogenerede model klasser fra din WSDL og ligge dem ud i et project for sig selv. På den måde kan alle dine lag få kendskab til modellerne, og du slipper for at mappe mellem forskellige modeller mellem lagene.
og det vigtigste, det kun dit infrastruktur lag som behøves at have kendskab til din service :-)
Jeg har delt mine lag op i namespaces, men det kan godt være at det ikke er hensigtsmæssigt?
Hvordan kan jeg "hive" klasserne fra WSDL'en ud i et projekt for sig selv? Jeg troede at klasserne blev hentet direkte fra Web Referencen, som kun infrastruktur-laget har adgang til? Jeg mener, kan jeg "kopiere" de klasser?
Hvis du dobbeltklikker på din service reference kommer du i object browser, her kan du så dobbelt klikken på en model klasse, og du vil så komme i Reference.cs eller noget i den stil.
Her kan du så kopiere de forskellige klasser og sætte dem ind i et andet namespace / project. Der er godt nok lidt "støj" i de klasser, som attributter og lign. Men det er jo partielle klasser, så burde ikke være det store problem at abstrahere fra.
Du kan så builde din solution og så vælge update service reference, og servicen vil så bruge de modeller der findes allerede. (hvis du altså under configure service reference har sat flueben ved reuse types in referenced assemblies)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.