thevice skrev:
...
För länge sedan så fick jag detta svar i en tråd av Nickemannen när jag frågade om arkitektur och upplägg av mina projekt.
...
Services (Domänservicar där business logik som inte passar in i entiteten ligger, arbetar bland annat mot repositories)
...
thevice skrev:
dock så förstår jag fortfarande inte vad service laget ska innehålla?
Tyvärr kan det uppstå missförstånd i den här typen av diskussioner eftersom det finns olika typer av services.
Jag tror inte att "Domänservicen" ovan syftade på service lagret.
Det finns nämligen ett lager som ibland brukar kallas Service Layer (t.ex. enligt Martin Fowlers bok Patterns of Enterprise Application Architecture) och i det lagret så finns det förstås Services.
Sedan finns det ett lager som kallas Domain Layer (t.ex. enligt Eric Evans bok Domain-Driven Design (DDD)) och där ingår också något som kallas Service.
Således kan man säga att det finns både "Service Layer Services" och "Domain Layer Services".
Det förstnämnda blir dock lite väl mycket tårta på tårta, och därför är det lämpligare att använda sig av begreppet Application Layer Services, vilket är ett begrepp som bl.a. Eric Evans använder sig av i sin DDD-bok.
Fowler's Service Layer är alltså synonymt med Evans Application Layer, enligt Fowler själv på hans sida om antimönstret anemiska domänmodellen.
En Service kan f.ö. finnas på andra lager utan att man anser den tillhöra någon av Domain Layer eller Service/Application Layer, t.ex. ett Infrastructure Layer kan innehålla en service för att skicka email.
Den kanske främsta gemensamma nämnaren för alla services i olika layers är nog att de är tillståndslösa (stateless).
När det gäller en Domain Layer Service så används sådana för att placera logik som inte naturligt hör hemma i någon entity eller value object i domänlagret.
Det bör således inte vara en utgångspunkt att försöka sträva efter att skapa domän services (för då är det risk att resultatet blir en tillämpning på det anti-pattern som Fowler kallar Anemic Domain Model (se länk ovan).
Man bör snarare sträva efter att placera logiken på en entity eller ett value object där logiken hör hemma bäst, men om man inte lyckas hitta något sådant, t.ex. för att man behöver använda data från olika klasser (entities/values) och inte vill skapa beroende från den ena till den andra, då kan man placera metoden i en Domain Service i stället.
En Application/Service Layer Service däremot består av mer use-case-orienterade metoder på en högre nivå, dvs en tidigare nivå i anropskedjan innan domänlagret, och är det första user-interface-oberoende lagret som alltså kan anropas från olika typer av klientkod.
Exempelvis bör man kunna återanvända ett Application/Service Layer från en ASP.NET Page, eller från Windows Forms, eller från en Web Service, efter att man förstås har transformerat bort alla klient-specifika saker, t.ex. bör inte några request-objekt eller windows-objekt förekomma i metodsignaturer i application/service lagret.
Från en application layer service metod kan man sedan bl.a. använda sig av domänobjekten (t.ex. entity, value objects, domain services, factories, repository och specification).
Som sagt var, terminologin är inte alltid riktig enhetlig där samma namn alltid används för samma sak, så som i det ovan nämnda fallet med att "Evans Application Layer = Fowler Service Layer".
Nedan följer några andra jämförelseer man kan göra, och som kan vara intressanta reflektioner för den som har läst (eller kommer att läsa) Larman-boken med GRASP patterns :
* GRASP Controller (som beskrivs som det första objektet efter UI layer) beskrivs på ett sådant sätt att den påminner starkt om Application/Service Layer
* GRASP Information Expert beskrivs som det objekt som innehåller informationen, och därför är en ofta naturlig utgångspunkt när det gäller var en metod ska placeras (förutom att även beakta övriga GRASP-principer såsom low coupling och high cohesion) och DDD-motsvarigeten är Entity och Value Objects, som är koncept från domänen/verksamheten som innehåller information och därför är lämpliga att placera relaterade metoder som behöver använda informationen
* GRASP Pure Fabrication är ett objekt som inte motsvarar något koncept i domänen, och där man kan placera metoder om det inte fanns någon lämpligare Information expert. DDD-motsvarigheten är Domain Service dvs där placerar man metoder om de inte passade bättre till någon Entity eller Value Object.