SweNug

Igår så hade SweNug GBG en dragning om S#harp Architecutre där Mikael från Dotnet Mentor gjorde en lysande presentation.

S#harp Architecture (sharp…) är ett paket med idéer från flera utvecklare hur de tycker du skall applicera Domän Driven tankegång (DDD- Domain Driven Design) ihop med exempelvis ASP.Net MVC och med hjälp av bland annat ORM (NHibernate) där de använder Fluent som grund.
Ramverket har templates för VS .Net m.m.

Rakverket i sig var ganska trevligt, dock mycket ful kod på sina ställen (mitt tycke). Det var många saker som var klumpigt implementerat men har säkert sin bakgrund. Ex Design By Contract delen gillade jag inte alls.

Ramverket i sig har massa designfel (inte kodmässigt). Exempelvis gillar jag inte idén att injektera Repositories klasserna in i MVC Kontrollerna. Repositories är typ data access klasserna, många känner nog igen likheten mellan dem med den fula notationen DAL eller Data.

Problemet med att skicka in dem blir att du helt plötsligt måste lägga in mer kod i don kontrollers än vad man egentligen bör göra. Du kan lätt få problem att skilja på businesslogik vs vanlig vypresentationslogik pga detta. Jag hade hellre sett att man injektade ett Applications lager /ApplicationService lager som i sin tur har logiken rörande repositories och domän serviceklasser. Detta för att lätt kunna ha olika UIs om det är ett krav för sin applikation. MVC skall vara löskopplat från sin applikation. MVC är designmönster för UI inget annat. På så sätt skall Kontroller (Controllers) mer eller mindre navigera systemet. Dvs innehålla Navigersingskod och info för presentera vyer. Men undantag finns ju självklart, som med allt i denna värld :/

En annan sak som jag inte blir klok på är alla Wannbe DDD som tror att entiteterna är Modellen. Hör upp =) en domän entitet är inte M:Et i MVC. Modelen i MVC är mer eller mindre en ViewModel. Den skall innehålla den info som krävs för att presentera och lagra data. Personligen hoppas jag det kommer finnas två modeller för en vy. En ViewModel och en EditModel. Där ViewModel har info som skall visas, EditModel info från vyn som man vill spara.

ASP.Net MVC har en hel del trevliga autobinding funktioner, dessa vill man gärna hantera smidigt. I ens Domän vill man helst ha DbC (Design by Contract) stöd. Problemet med att ha sin entitet (Databärare) är att använder du den som Model så kan du inte ha 100% stöd för DbC. Inte nog med det så får du även med mer info till Vyn än du behöver visa. M.m. (Tänk YAGNI) DbC har du för att ge snabb feedback till dig själv och andra att ”dude du använder min kod fel” detta för att öka kvalité och möjligheten att faktiskt inte kunna använda något på fel sätt. Många kan anse denna hantering onödig men det är mer tydligt när man faktiskt använde denna princip och upplever alla fördelar själv som man inser hur nyttigt det är för dig och dina kollegor.

Säg att du har en Address entitet den har ett value objekt Email. (Address.Email) när du sätter en E-mail adress och kör med DbC så skall du bla kolla så du inte sätter null värde och eller något annat än en giltig E-mail. Ett problem som uppstår när du ex använder din Address som model är att Autobindingen som då kommer få ett fel vid bindning om man ex lämnar en textbox tom. PS. Du kan ha klientvalidering om du vill för att ”kräva rätt värden till din Model” MEN tänk på att DbC är något alla klasser har och inget ett UI lager skall sköta åt dig. Vaklidering på UI-lagernivå finns där för att minimera fel och ge info om saker man måste fylla i. Sen så händer allt bakom skalet och det är där det viktiga händer och det är där det inte får gå fel. Det är bla detta DbC hjälper dig med.

Annotationstöd finns också som kräver att vissa saker uppfylls på sina Modeller. Som kan presentera en snygg Summary och vilka färlt som har krav på att vara ifyllda. Det går att använda dessa för ex DbC problemet är att dina Entiteter (om du envist skall använda dem som model) får en refference och beroende med UI. Domänlagret i DDD skall inte känna till vad som finns ovan. Ex Den skall inte han kännedom eller vara låst till ditt UI. Ett annat fel många gör när de nyttjar MVC och DDD.

Det finns en sjö argument varför och förklaringar på en hel del forum ang detta.

I övrigt så var S#harp Arcitecture en bra grund för att visa lite lätt hur man kan strukturera sin kod med NHibernate och ASP .Net MVC för de som inte är vana vid varken DDD eller MVC .

Kommentera

Du måste vara medlem i SweNug för att lägga till kommentarer!

Gå med i SweNug

Johan Normén Kommentar av Johan Normén den 3 November 2009 kl. 11.56
Stört. Skrev ett långt svar på detta men så fick jag upp. Inlägget måste godkännas... sen försvann skiten.
Så orkar inte skriva om det :)

Men det var om DbC, ViewModel vs Entiteter. Där jag hade mer argument varför entiteter INTE skall användas som modeller. Samma som de inte skall användas som DTOer... Samma som de inte skall vara RIA service databärare... etc... Testning och löskopping var oxå några av argumenten :)
Att det tar mer tid att utckla hade jag motargument på oxå :) och varför det med högs sannorlikhet ihop med DbC inte skulle ta mer tid utan tvärt om... Ungefär som de metaforiska argumenten om vinsten med Nunit tester...

Synd att ning knasade ut :/

Mvh Johan
Mikael Egnér Kommentar av Mikael Egnér den 1 November 2009 kl. 22.34
Hej, kul att du gillade presentationen!

Jag tycker nog inte att det är några större fel på "Design By Contract"-klasserna.
Tror att de hängt med sedan 2006 från "NHibernate best practices"
Det kommer ju inbyggt i .Net 4 och fr o m då blir det väl narurligt att använda det som finns .Net.

Tanken med ApplicationService-assemblyt är just att kunna lägga mer komplicerad "controller-logik" där.
Vill du ha det som default-mönster och få med det i den genererade koden via T4-templates är det enkelt att ändra dina templates.

Jag tycker visst att Domänmodellen KAN vara M:et i MVC.
Har man en någorlunda enkel modell så kan det vara så att overheaden med att ha en vymodell (aka klientmodell) blir större en vinsten.

Det är ju inte alltid som man har möjligheten att göra en applikation "perfekt" i teoretisk mening, utan "ibland" har man ju även någon som inte vill betala obegränsat med pengar ;)

Men jag håller med dig i tänket, och det kanske är så att det inte kostar så mycket om man kör på vymodell-mönstret och gör på samma sätt varje gång.

I senaste skarpa MVC-projektet (dock ej S#arp Arch) jag var med på använde vi vymodeller och där kunde vi då hålla vyerna väldigt enkla.

Den stora fördelen med S#arp Architecture tycker jag är att all infrastruktur runt NHibernate med automap redan är på plats.
Du slipper fundera på hur du skall göra med sessionshantering, repositories, transaktionshantering etc.
Du får även väldigt mycket hjälp med test-delarna.

Mvh
Mikael Egnér

© 2010   Skapad av Jarle Skogheim   Powered by .

Emblem  |  Rapportera en händelse  |  Användarvillkor