Jeffrey Palermo pakkus hiljuti välja arhitektuuri, mida ta nimetab “Onion Architecture”. See ei ole küll nii naljakas nagu Francis Shanahan välja pakkus.

Nimed pildil räägivad enda eest ning seletusi selle kohta leiab järgmistest kannetest: 1. osa, 2. osa, 3. osa.
Siiski teen kiire ülevaate asjadest:
- Domain Model – see on ärimudel. Seal on määratud äriobjektid ning nende vahelised seosed.
- Domain Services – Koosneb äriteenustest. Peamiselt sisaldab liideseid. Siia alla tuleb enam jaolt andmehoidlate liidesed, mille reaalsed klassid asuvad infrastruktuuris. Lisaks võib julgelt sinna alla viia ärilise sisuga teenuseid näiteks DiscountService vms.
- Application Services – Siin peaksid olema igasugused rakenduse teenuste liidesed. Lihtsamateks näideteks oleksid logimise (seda võib ka teha AOP kasutades) ja autentimise teenus.
- UI – See on rakenduse visuaalne külg. (Arvatavasti võib käsurida piisavalt visuaalseks nimetada =D)
- Infrastructure – Infrastruktuuriga tegelevad objekti. Sinna peaksid tekkima hoidlate (Repository) reaalsed klassid ning need võivad seotud olla NHibernate-ga.
- Tests – Kõiksugused testid.
Kihtide vahelised seosed on suunaga tuuma poole. Seega Domain Model ei peaks midagi soovima Domain Service ega ka Application Service kihist.
Need liidesed, mis on rakenduse tuumas viiakse kokku reaalsete klassidega DI Container‘i abil. Sellise mudeliga ei tea tuum midagi infrastruktuurist (Infrastructure Ignorance), ja ärimudel ei tea, et teda salvestatakse (Persistence Ignorance). See tähendab, et klassid on siis nö POCO või POJO, mille üldine nimetus peaks olema POxO ehk Plain Old x Objects. Tulemus on kergemini uuestikasutatav kood.
Kuna ise olen jõudnud lähedase arhitektuurini, siis natuke lisaks mõtteid ka omalt poolt. Kui juhtub, et UI-sid on mitu ja need on erinevates projektides, siis seadistuse pidev kopeerimine (ja sünkroniseerimine) ei ole just kõige mõnusam tegevus. Seega arvan, et infrastruktuuri ja UI vahele võiks sobida Configuration pakett. Selle peamiseks mõtteks oleks hoida NHibernate mapping faile, DI Container‘i seadistust (saaks koodis teha, vähem XML-i), teiste infrastruktuuri seadistused ja ka config failide sektsioonid (juhul kui vaja).
Selle puhul tuleb arvestada ka sellega, et sealne kood peaks olema piisavalt paindlik, et UI poolt saadud seadistusega saaks muuta. Näiteks UI-s tuleb siduda DI Container‘i abiga mõned kontrollerid. Seda mõtet pole veel jõudnud katsetada, seega kui keegi leiab, et sellega võib suuremaid probleeme tekkida, siis andke teada.
Teine probleem, mis selle juures mulle ette tuleb on äriobjektide valideerimine. Nimelt atribuutide kasutamine Domain Model‘is tundub selle puhul väär, sest see seob koheselt infrastruktuuriga. XML failide kirjutamine oleks lahendus, kuid seda väga ei eelistaks. Eelmise idee välja pakkumisega oleks hea kasutada koodi ehk DSL-i.
Igal juhul olen avatud igasugustele ettepanekutele, kuidas sellist arhitektuuri võiks paremaks muuta ja kuidas esinevaid probleeme lahendada.
Loe veel sarnastel teemadel:
- KoopiaKoopiaKoopia ei ole ilus, 20. veebruar
- Ilus kunst, 25. oktoober
- CruiseControl.NET uus ja ilus nägu, 22. juuli
- Võõrastega ei suhelda, 16. aprill
- Iluvõtted koodile IV, 12. mai
4 kommentaari
1
Kaks ideed käib valideerimise kohta peast läbi. Üks on XML-id, mis hoiavad valideerimise domain modelist eraldi ja mis ei tekita domain modelisse atribuutide näol ebameeldivaid lisandeid juurde. Sellisel juhul jääb siiski alles sõltuvus konkreetsest valideerimise frameworkist.
Teine variant kaotaks kõik sõltuvused ja see tähendaks seda, et kogu valideerimise krempel tuleb kirjutada ise. Tuim kood, mis oskab erinevaid objekte valideerida, kuid see-eest ei teki ühtegi lisanduvat sõltuvust. Paindlikkus kaob muidugi sel juhul kohe ära…
Gunnar
22:43, 21. august
2
XML aitab raamistiku sõltuvusest lahti saada küll. Samas on mulle pähe tulnud selline idee, et teha valideerimise raamistik, mis kasutab koodi seadistamiseks, midagi keeleliku nagu Fluent NHibernate (http://code.google.com/p/fluent-nhibernate/). Seejärel tuleks kood panna configuration paketti ja elu on nunnu edasi. Hea külg sellel oleks see, et ümberstruktureerimised läheksid tunduvalt libedamalt.
AOP abiga võib ka midagi kavalat välja mõelda, kuid sel korralgi tuleks mingisugune seadistus kirjutada.
Marek Tihkan
23:08, 21. august
3
XML pole tegelikult väga hull asi, kui raamistik ise seda mõistlikult kasutab. Ma pean silmas seda, et valideerimise reeglid loetakse sisse siis, kui rakendust laetakse või kui mõni failidest muutub (huvitav, kas mõni raamistiks kasutab enda XML-konfi ja FileSystemWatcher objekti näiteks). Peamine pluss oleks see, et paljud lihtsad muudatused saaks teha ära ilma deploymentita. Näiteks sellised asjad, et “jou teeme nime välja pikemaks, meil on kliendiks türgi sultan”. XML korral saaks selle asja joonde ajada lihtsasti – üks muudatus baasi ja üks valideerimise definitsioonidesse.
Gunnar
19:37, 23. august
4
Hmm… kas just otseselt see valideerimise teemale lahenduseks oleks, aga on olemas selline vidin nagu NxBRE: http://www.dt.ee/blog/kood/2006/08/business-rules-engine/ MS-il on enda BRE ka olemas, kuid millal ja mille koosseisus see eksisteerib, on mul siiani suht selgusetu.
Gunnar
17:36, 26. august
Lisa kommentaar
KAIZEN FEED
Telli endale Kaizeni uudisvoog
KOMMENTAARIDE FEED
Telli endale kommentaaride voog
KAIZEN TWITTER
Lühiuudised Kaizeni autoritelt
KAIZEN FACEBOOK
Liitu Kaizeniga
MIS ON KAIZEN?
Kaizen on Saiku tarkvaraarendusealane blogi, kus kirjutame erinevatest lähenemistest meisterlikule tarkvaraarendusele.
KATEGOORIAD
- .NET (18)
- Analüüs/Arhitektuur (11)
- Arendus (66)
- Ettevalmistus (1)
- Juhtimine (2)
- Varia (24)
SILDIPILV
- .NET (41)
- ilus kood (23)
- Arendus (23)
- C# (20)
- Analüüs/Arhitektuur (14)
- Testimine (10)
- raamat (8)
- Ruby (8)
- projektijuhtimine (8)
- printsiibid (6)
- produktiivsus (5)
- ReSharper (5)
- PHP (5)
- NHibernate (4)
- objekt-orienteeritud (4)
- pidev integratsioon (4)
- Viited (4)
- agile (4)
- Java (4)
- Geekdinner (4)
- lean (4)
- raamatukogu (4)
- CI (3)
- Cruise Control.NET (3)
- Robert C. Martin (3)
- scrum (3)
- iteratsioon (3)
- suhtlus (3)
- jQuery (2)
- TechEd 2008 (2)
- Visual Studio (2)
- valideerimine (2)
- intervjuu (2)
- tööpakkumised (1)
- analüüs (1)
- ASP.NET (1)
- ümberstruktureerimine (1)
- üritus (1)
- CodeRush (1)
- dokumentatsioon (1)
- Kent Beck (1)
- LINQ (1)
- Martin Fowler (1)
- Moq (1)
- Rhino Mocks (1)
- stackoverflow (1)
- võltsitud objektid (1)
- Whiteboard Wednesday (1)
- hindamine (1)
- tarkvara kvaliteet (1)
- ajagraafikud (1)
- Saiku (1)
- koolitus (1)
- tagasivaate (1)
- koosolek (1)
- dünaamilised keeled (1)
- staatilised keeled (1)
- FluentNHibernate (1)
- facebook (1)
- aastapäev (1)
- Rake (1)
- Oredev 2008 (1)
- toyota way (1)
- raiskamine (1)
- NDepend (1)
- podcasts (1)
- väle tarkvaraarendus (1)
- raido tonts (1)
- minimal marketable feature (1)
- kasutajalugu (1)
- twitter (1)
- Joomla! (1)
- MVC (1)
- andmebaas (1)
- versioonimine (1)
- diskussioon (1)
- regulaaravaldised (1)
- motiveerimine (1)
- mõõdikud (1)
- agileestonia (1)
- riistvara (1)
- koolitused (1)
- kujundus (1)
- kodulehed (1)
- veeb (1)
