Niet echt veel tijd, maar toch proberen even snel te antwoorden.
EfBe schreef op zaterdag 13 februari 2010 @ 11:05:
[...]
Echt... jouw klant wil jou betalen voor het intikken van fluent nhibernate code? Als er iets is wat redundante plumbing is dan is het dat wel. Het ironische is nog dat de fluent nhibernate fans falikant tegen buddy classes zijn voor attribute based validation (op zich terecht) maar wel buddy classes gaan schrijven voor mappings (en doe dat maar eens voor een entity of 100... veel tikplezier

)
Ik heb zelf nog geen fluent gebruikt; ik doe al mijn mappings in XML, en op zicht valt dit -met de intellisense- best mee.
Ik haalde gewoon fluent aan, als reactie op '... en ik heb een enkele regel xml moeten typen'.
De grootste fout die een developer kan maken is het aannemen dat een database weggeabstraheerd kan worden. De database is een essentieel onderdeel van je applicatie en zo belangrijk dat wellicht 40% of meer tijd doorgebracht wordt in die database. Die onder het tapijt moffelen is de hoeksteen van een mislukt project. Het jammere is dat veel developers die dat doen dan alweer op een ander project zitten en niet hun eigen puin hoeven op te ruimen.
Ik zeg niet dat je de database moet weg abstraheren.
Ik wil gewoon het volgende zeggen:
Als ik bezig ben met mijn domain model, dan is dat hetgeen wat me interesseert. Ik wil me dan met de business logic bezig houden, en ik hoef op dat moment niet 'afgeleid' te kunnen worden van hoe een bepaalde entity nou in de DB wordt opgeslagen.
Ikzelf ben het helemaal met je eens dat de DB verder een belangrijk onderdeel van de applicatie is. Die moet gewoon goed ontworpen worden, maar, ik wil er niet altijd mee geconfronteerd worden als ik met een stuk domein-logica bezig ben.
Jij moet een reference leggen met de nhibernate assembly, die komt met een tiental andere assemblies. Jouw applicatie gebruikt zeer waarschijnlijk 3rd party UI controls, die je dus ook moet referencen. Onder het mom van 'ik wil geen dependencies' ga je erg veel redundant werk doen op kosten van je klant (intikken van mapping 'code') en in the end maakt het geen zak uit, want jouw klant gaat echt het domain model niet hergebruiken en zit toch aan een serie assemblies vast in zn applicatie.
Ik heb nergens gezegd dat ik geen dependencies wil in mijn applicatie.
Echter, ik wil wel mijn project waar mijn domain classes zich bevinden 'zo schoon mogelijk houden'. Daar wil ik liever geen dependency met de O/R mapper bv, omdat de kans bestaat dat je dan toch gaat verleid worden om bepaalde data-access code rechtstreeks in je domain classes te gaan schrijven.
Ik stop m'n domain classes meestal in een eigen DLL, samen met de interface definities van de repositories (die horen m.i. bij het model).
En dan heb ik daarnaast een andere DLL met bv een NHibernate implementatie van mijn repository interfaces. Op die manier kan ik trouwens gemakkelijk andere implementaties gaan maken van mijn repositories voor mijn unit-tests bv.
Of denk je dat je zo een o/r mapper kunt wisselen omdat je poco gebruikt? Iedere o/r mapper lekt zn features (zn 'entity services') door in je code, dat is onvermijdelijk omdat je die services juist gebruikt in je code (waarom zou je het anders gebruiken?), dit heeft als nadeel dat je code dus gekoppeld is aan de o/r mapper. Standaard voorbeeld:
myOrder.Customer = myCustomer;
Nee, ik besef heel goed dat je de O/R mapper niet zomaar kunt wisselen. En ik vraag me trouwens ook af waarom je dat zou willen doen ?
In nhibernate na het statement hierboven, dit is false:
myCustomer.Orders.Contains(myOrder);
Waarom zou dat in NHibernate false returnen ? Dat hangt m.i. toch gewoon af van de implementatie van je Equals() en GetHashCode methods ?
EDITIk had de regel daarboven niet gezien. Tja, dan nog hangt het af van de implementatie van die property. In NHibernate zal je -indien je wil dat dat statement true returned- idd zelf de nodige logica in die prperty setter moeten gaan schrijven ...
in veel andere poco o/r mappers, is dat true (en terecht, het is een reverse relationship, en wat nhibernate doet is eigenlijk niet correct, zoals wel meer in dat framework).
Er zijn er meerdere, waaronder het ghost type probleem bij lazy loaded proxies. Poco komt met een prijs, en die is in feite altijd nadelig. Het vervelende voor de klant is echter dat de developers niet geinteresseerd zijn in het bouwen van saaie code voor de klant maar veel liever stoere plumbing code schrijven, zodat het lijkt alsof ze belangrijke software aan het maken zijn. Want zeg nou zelf, na het tig-ste scherm met ditto saaie BL rules wordt het allemaal wel erg slaapverwekkend, niet?

Sure, dat framework heeft zeker zijn minpunten, net zoals ieder framework dat heeft. Maar, tot op dit moment voldoet het voor mij, en kan ik er redelijk goed mee overweg. Het neemt werk uit handen, die tijd kan ik besteden aan de code waar het echt om draait.
owja, die lazy loaded proxies van NHibernate, die schakel ik altijd uit. Dat is echt het eerste wat ik doe.