Say I have a User object, which is generated by a Usermapper. The User object does not know anything about the database/repository in use (which I believe to be good design).
When creating a User, I only want it to have it filled by the mapper with the most trivial things e.g. Name, address etc. However after object instantiation I might have a method userX.getTotalDebt(), getTotalDebt() would need to reconnect to the database , because I don’t want this relatively expensive operation to be done for every User instantiation (multiple tables needed etc). If I’d simply insert some sql in the getTotalDebt() or a dependency back to the Mapper where the coupledness is growing tight very fast.
There is an obvious good/best practice for this, because it’s a situation arises often, however I can’t find it or I’m looking at this problem totally from a wrong angle.
They are often referred to as POCOs (Plain Old CLR Objects).
There are several OR/M layers which can achieve this. Use either nhibernate or Entity Framework 4.1 Code First.
Then it’s not a poco anymore. Although it is possible using a transparent proxy. Both EF and nhibernate supports this and it’s called Lazy Loading.
I usually keep my objects dumb and disconnected. I use the Repository pattern (even if I use nhibernate or another orm) since it makes my classes testable.
I either use the repository classes directly or create a service class which contains all logic. It depends on how complex my application is.