Martin Fowler has a recent entry about Anemic Domain Models as an antipattern. The gist of it is that a common [anti] pattern he sees is that application layer (or service layer) is very heavy with logic, whereas the domain model (the core business/data objects) is too thin, if not completely devoid of logic. Fowler claims that this turns development back into a procedural model, with the application layer providing all of the procedures that operate on the domain model data structures; and that this flies in the face of a founding tenet of object oriented development - namely, the joining together of data and process.
This is an issue I've been struggling with, and I have to say that I tend to prefer the service layer approach, at least in my current external data store based applications. Knowing what to put in the domain model, and ensuring it gets loaded up in the places it needs to get loaded, is a fair bit more difficult. Most applications and business processes revolve around more complex actions that deal with multiple objects, and exposing those interfaces as a service tends to be much easier to manage (situation depending). I agree that a domain model should not be completely devoid of process - but I'm finding most complex process code gravitates away from the model.
I'm finding this to be even more true when dealing with very central and complex business objects. In one case that I have, there are three different Table Gateways that map to a single table. They have different business responsibilities:
Still, the "where does the domain logic go?" question plagues us. I have my data layer, which has not been extracted into a harvested framework yet; a coworker has been developing a much more detailed one with (with different requirements) based initially on my patterns but going towards different goals; and as we go into 2004 we hope to turn them both into a solid data access framework to develop and deliver applications on. The domain logic organization problem is significant. Actually, logic of any kind's organization is significant. Already, much of the data access logic is encoded in rule sets that can be combined in different ways off of a schema, and that alone is a significant piece of business logic. However, that does not encompass business processes. Placing an order, filing a maintenance report, managing email servers - all of these processes are services. They can be objects, in that they can be persistent and are often some sort of class instance (true in our case), but ratio of data to process is heavily skewed in the process direction.
Maybe I'm just thinking about it all wrong. In any case, as we start evaluating architecture, I'm hoping something solid will reveal itself for our situation(s). In the meantime, I'll probably continue to read articles and books championing the process heavy domain model and thin service layer approach, and ones championing the heavy service layer and thin domain model approach.