- views can call controllers
- controllers only talk to views and service layer (where the transactions are)
- service layer has a series of calls to domain object(s) wrapped in a transaction
- domain object contains the calls to dao layer.
- dao layer populates domain objects and persists data.
But I can pass the domain object around the different layers to access data via getters, or do I have to use a dto – a cut down domain object containing data specific to views/use-cases. Passing domain objects around the layers seems to encourage breaking the rule that layers can only talk to the specified other layers. But on the other hand, that is the point of DDD ? If it is preferable to take data from the domain object and put into a dto, where should this take place, the controller ?

you should put the domain next to all other layers since it should be 100% independent of everything else. hence you should be able to use it everywhere.
Services in DDD should only be used when two or more different root aggregates need to interact.
As for transactions, why don’t you just use
TransactionScopein the UI layer? It’s still persistance ignorant.I personally use the repositories directly in the UI (since the repository in DDD is a DB abstraction)