Or you can expose the DAO as a property of the page, and do source="dao.findAll()" rather than source="findAll()".
On Thu, Nov 20, 2008 at 9:16 AM, Jonathan Barker <[EMAIL PROTECTED]> wrote: > > Ah, I had to jump in. > > I like using business services that keep data access code out of my pages. > That part feels good. > > Unfortunately, that often means that a findAll() in the DAO has a > corresponding findAll() in the service and that just feels silly. > > As a result, I tend to use services for "complicated" stuff that involves > multiple steps or DAO's, and do direct DAO calls from pages for the simpler > stuff. Sometimes that means that I'll be injecting services, and the DAO's > that the services use into my pages. That also feels silly. > > So then I consider the statement that DAO's have become an anti-pattern. It > makes sense when you consider the redundant findAll()'s that result from > separating data access and business services. On the other hand, it doesn't > feel good cluttering business services with HQL, SQL, or whatever. > > To really muck it up, I've got DAO's that extend a generic base DAO. That's > fine until the class hierarchy gets a few levels deep and now I'm writing > DAO's for Person, Customer, and Employee. > > If anyone figures out the "One True Way", let me know! In the meantime, > I'll settle for keeping Session out of my pages. > > Jonathan > > >> -----Original Message----- >> From: Chris Lewis [mailto:[EMAIL PROTECTED] >> Sent: Thursday, November 20, 2008 11:42 >> To: Tapestry users >> Subject: Re: Tapestry-IoC: binding service without code, just convention >> over configuration >> >> Thanks for the input Thiago. I'm curious about your reasoning for >> avoiding tapestry-hibernate. I use it for it's value encoder and primary >> key encoder auto wiring, and that's pretty much it. I avoid injecting >> Session into pages, and I assume that's the practice you specifically >> are avoiding in the name of separation of concern, is that right? >> >> I use the same kind of DAO pattern, and I manually wire up DAO >> implementations in bind() (which is where your idea might be interesting). >> >> I value quality architecture as well, but I'm still trying to understand >> what you achieve by slapping in the idea of an entity controller that, >> for what I can understand, is just a layer between your pages and your >> DAOs. Do share with me if you disagree, but I treat page classes as >> controllers for their views. In reality they're more like a box of >> controllers for the various components, but the point is the same. What >> value then do you gain from not interacting your DAOs directly, and why >> does that satisfy your architectural wants? >> >> Thanks again for sharing, I value such conversation :-). >> >> chris >> >> Thiago H. de Paula Figueiredo wrote: >> > Em Wed, 19 Nov 2008 17:37:48 -0300, Chris Lewis >> > <[EMAIL PROTECTED]> escreveu: >> > >> >> Hi Thiago, >> > >> > Hi, Chris! >> > >> >> Out of architectural curiosity, what do you use a UserController for in >> >> your example? >> > >> > I'm a strong supporter of n-tier architectures, so the view layer (in >> > this case, Tapestry) does no business rules nor does data storage >> > operations, just deals with the user actions*. Therefore, I have an >> > UserController (an interface) and UserControllerImpl, the class that >> > implements any business rules or processes (except persistence) >> > related to my User entity. >> > >> > To see one example of this, all the interfaces and classes cited in >> > this message are part of Ars Machina Project's Generic Authentication >> > package (http://www.arsmachina.com.br/project/genericauthentication). >> > You can browse its source here: >> > http://ars-machina.svn.sourceforge.net/viewvc/ars-machina/generic- >> authentication/trunk. >> > >> > >> > For the persistence layer, I have DAOs and the Generic DAO and Generic >> > DAO-Hibernate packages >> (http://www.arsmachina.com.br/project/genericdao). >> > >> > UserController is a Controller (Generic Controller package, >> > http://www.arsmachina.com.br/project/genericcontroller), subinterface. >> > One of its methods is List<T> findAll(int firstResult, int maxResults, >> > SortCriterion... sortConstraints). If you thought of GridDataSource, >> > you're right. :) >> > >> > Tapestry CRUD (http://www.arsmachina.com.br/project/tapestrycrud), >> > another Ars Machina Project package, defines a BaseListPage<T, K> >> > abstract class (T = entity class, K = entity class primary key field >> > type). BaseListPage finds out what entity its is listing, then gets >> > its associated Controller instance. It is used to generating an object >> > listing using the Grid component. This is why I would like to provide >> > a default Controller instance if none is given: I wouldn't need to >> > create a trivial Controller implementation for that. ;) >> > >> > Have I satisfied your curiosity? :) If not, I can try to explain it in >> > a better way. ;) >> > >> > * That's why I don't use Tapestry-Hibernate: in my humble opinion, it >> > puts transaction control (a processing thing, it should be in the >> > business rules layer) in the wrong layer (view). >> > >> >> -- >> http://thegodcode.net >> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: [EMAIL PROTECTED] >> For additional commands, e-mail: [EMAIL PROTECTED] > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > -- Howard M. Lewis Ship Creator Apache Tapestry and Apache HiveMind --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]