Det du är ute efter är en SOA (Server Orienteted Aritchture) eller hur det nu stavas.
När behöver man ett sådant system? Enklaste form av SOA möter du varje dag, nämligen en webserver.
Så fort du känner ett behov av Webservices så har du behov av SOA. Alltså när du vill kunna dela med dig av data i en kontrollerad form, alltså du vill kunna kontrollera vad som skickas till dig och vad som skickas från dig och när du kan tänka dig att du har flera olika sorters klienter av olika typer: Webbrowser, winforms, PocketPC, mobiltelefoner.
Här är SOA en utmärkt lösningen eftersom du då endast behöver göra mycket tunna skal till de olika klienterna medans all logik ligger på din applikationsserver. Det betyder givetviss mer nätverkstrafik men samtidig en högre utvecklingshastighet och bättre underhållsmässigt. Skall du endast använda dig av en klient så tar det längre tid att utveckla i SOA.
På vårt jobb så går vi över mer och mer till SOA dock så vill vi behålla OO känslan i klienten vilket gör att vi får en del extra lager samt mer att koda. Här kommer ett lite exempel.
Säg att du har en Bank. Du skall kunna ta fram alla konto för en kund, och även se alla transaktioner för dessa konto.
I OO så blir det så här:
Kund kund = new Kund();
kund.Konto[0].Transactioner()
I SOA så har du inge logisk koppling mellan Kund och Konto och inte heller mellan Konto och Transactioner, utan man måste hela tiden skicka med ett id för att hämta rätt konto/transaction (detta dols i OO för slutprogrammeraren)
så i SOA skulle man skriva så här:
Kund kund = Bank.GetCustomer(KUND_ID);
KontoCollection kontos = Bank.GetAccounts(kund.id);
TransactionCollection transaction = Bank.GetTransaction(kontos.id);
Detta eftersom du i en SOA miljö vill få så löstkopplade system som möjligt (eftersom du vill att andra system också skall kunna använda dig av banken).
Tyvärr så är det inte så enkelt att förstå att en kund har konto kopplade till sig då man måste gå via Bank objectet (som är din väg in på applikationsservern), så det vi gör är att vi wrappar om bank objectet i vårt klientlager:
Det betyder att i vårt Kund objekt som vi skapar lokalt så skriver vi.
public class Kund{
public ICollection Accounts{
get{
return Bank.GetAccounts(this.id);
}
}
}
Nu kan vi i vår webklient skriva Kund.Accounts så får vi alla konto som tillhör denna kund, det är intuativt samt att vi använder SOA så om vi skall skapa en ny applikation som skall använda sig av banken så kan vi kalla på vår Bank.GetAccounts(KUND_ID) och det kommer att ge exakt samma sak. Man kan säga att Bank är en komponent som du har skrivit som lever ett eget liv på en egen server som du kan kalla från vilken klient som helst.
Projekten behöver inte vara speciellt stora, utan då man ser en vinst i att kunna återanvända sig av det man skriver samt att man vill att andra system skall kunna komma åt din funktionallitet. Är det så att du programmerar i .NET och vill att Java applikationer skall kunna komma åt din applikation så är webservices väggen att gå, är det endast .NET applikationer som skall komma åt din applikation så är det .NET Remoting som är lösningen.
Håller precis på med en Banklösning och till detta enkla exempel så har jag inte mindre än 7 olika projekt där 5 av dem iprincip bara är wrappers som wrappar ett underliggande lager. Det gör att det tar lite längre tid att skriva i början men sedan kan jag återanvända min Bank-applikation från andra applikationer.
Hoppas jag inte rörde till det för mycket för dig.
- Magnus