Tyvärr har SOA, det vill säga Tjänstebaserad Arkitektur, alltför ofta blivit synonymt med Webbtjänster. Anledningen till detta är säkert flera. Men det är verkligen viktigt att inte sammanblanda dessa två saker. Webbtjänster är en av flera teknologier för att implementera tjänster. Andra viktiga teknologier som kan användas är bland annat meddelandehanteringssystem (MOM), typ MSMQ.
Av det skälet är det också viktigt att särskilja på den teknik som skall användas för att kommunicera med tjänsten och tjänsten i sig själv. Man börjar med att bygga tjänsten och sedan skapar man, efter att ha bestämt hur tjänsten skall utnyttjas, dess gränssnitt och detta gränssnitt innehåller funktionalitet för att använda tjänsten som en webbtjänst eller någon annan teknologi för att kommunicera.
För att vara extra tydlig i särskiljandet kan det vara bra att skapa två olika projekt för dessa båda delar. Dels ett projekt av typen "Class Library" för själva tjänsten och dels ett projeckt av typen "Web Service", för att implementera kommunikationen emot tjänsten. (Naturligtvis skall man inte skapa ett projekt av en sådan projekttyp om man skall använda någon annan kommunikationsteknologi.)
I båda projekten använder vi oss av Xsd för att definiera gränssnitten. Vi kan dock tyvärr inte definiera operationernas namn (alltså metodnamn) med hjälp av Xsd. Men vi kan definiera informationen som använts vid kommunikationen med operationerna. För att generera kod av dessa scheman används Xsd.Exe för själva tjänstprojektet och Wsdl.Exe för kommunikationsprojektet. Det gör att vi kan använda samma scheman (xsd) för båda projekten. (Skillnaden mellan dessa två kommondan är att Wsdl.Exe också genererar en wsdl-fil.)
Jag vill avsluta med att visa det som jag sagt ovan med följande diagram. Som vi ser här består OrderProcessService av två delar, dels själva tjänsten och sedan en Service Dispatcher. Denna dispatcher implementerar själva kommunikationen med klienten. Den är definierad med hjälp av Xsd och Wsdl, som finns beskrivna i kontraktet. Utifrån kontraktet genereras kod med hjälp av Wsdl.Exe. (Kontraktet används också för att definiera själva tjänstens gränssnitt, men det syns inte i bilden.)
Man behöver iofs ej skilja på dem som olika .NET projekt. Det går fortfarande att anropa en klass som utgör en web service via ett vanligt objektanrop, dvs ej över HTTP/SOAP.
Posted by: Nicklas | 2005-06-03 at 08.37