10

I have trouble drawing a clear line between Presentation and Application layer in Domain Driven Design.

Where should Controllers, Views, Layouts, Javascript and CSS files go?

Is it in the Application or the Presentation layer?

And if they go all together in the same layer, what contains the other one? Is it empty?

Matthieu Napoli
  • 615
  • 2
  • 6
  • 13

3 Answers3

15

There is a big difference between the application layer and the presentation layer from a DDD view point.

Although DDD centers around how to model the domain using the DDD building blocks and concepts such as bounded contexts, Ubiquitous language and so, it is still vital to clearly identify and separate the various layers in your app.

The architecture plays a big role in implementing a successful DDD app. A famous architecture that gained a lot of hype lately is the onion architecture:

enter image description here

In this design the UI/Presentation layer and the application layer are clearly separated. Merging the 2 together introduces tight coupling between 2 layers that have clear separate concerns and responsibilities.

The Presentation layer should only house presentation logic. Avoid Smart UIs that know too much. This mainly houses the MVC's Controllers and views in addition to CSS, JS, templates, forms and everything that relates to response and request objects.

The actions issued through presentation are delegated to the application layer through commands. The application layer contains the application logic. It normally maps to a use case. It contains WHAT the system should do to satisfy a use case. A typical application service will ask a repository to return an aggregate then invoke an action on that aggregate.

Have a look at the sample project from Vaughn Vernon's IDDD

Songo
  • 6,548
  • 4
  • 48
  • 89
  • 2
    +1. This is how i've implemented my project. Immediately, i was able to make gains by doing so. Since I abstracted to an application layer, I was able to have multiple presentation layers. For example, our web api and our web site both consume the application layer which saved a lot of time and duplicated code since my web app doesn't have to frame messaging to and from the web api and it keeps all of the logic in sync between the two. – Sinaesthetic Jan 21 '16 at 01:47
  • Where are `entry point` and `composition root` placed? I always thought it was a responsibility of `Application` layer. But now it looks like this is `Presentation` layer. – Denis535 Feb 24 '20 at 22:00
9

Just because someone created and named "Application Layer" and "Presentation Layer" doesn't mean your application should have them. You should create layers AFTER you created substantial amount of code which you grouped together and want to name this group for sake of communication between developers and clarity of code.

From point of DDD. Application Layer is everything that is not Domain layer. Which includes application logic, presentation and application services.

Euphoric
  • 36,735
  • 6
  • 78
  • 110
  • 3
    Thank you, indeed you made me realize that for my case separating Application and Presentation is useless. Simplicity first! – Matthieu Napoli Dec 24 '12 at 09:43
  • If DDD has REST API instead of UI in presentation layer, would REST API be an application or presentation layer. I am now confused, since I was sure that REST API is a presentation layer.. – Dario Granich May 06 '16 at 13:33
  • 15
    Actually, DDD prescribes *four* layers in the following order, from higher to lower: Presentation, Application, Domain, Infrastructure. So, the Application layer does *not* include "presentation". Also, it's always a good idea to decide on the layers *before* a significant amount of code is written, as it isn't only about grouping code together but also about constraining the direction of compile-time dependencies. – Rogério Feb 21 '17 at 17:36
2

Domain Driven Design has nothing to do with either Presentation layer or Application layer. DDD is a methodology whose main focus is on the Domain layer. That is, DDD does not impose any constraints regarding any other layer except for the Domain layer and Your question as well could be asked in the context of any other methodology.

That being said, it's very common to use a four-layer architecture for DDD applications. Here's an example of one such application showing the layers and their intended use: DDDSample Architecture. So, if you choose to use this architecture your views and layouts would go to the Interfaces layer and the controllers, if interface-independent, would go to the Application layer.

You might as well choose any other kind of architecture, as I've said DDD does not impose constraints. There are many MVC frameworks out there that have different structures and yet could also be used for DDD applications. Then, of course, you would place Your views and layouts accordingly.

gnat
  • 21,442
  • 29
  • 112
  • 288
zafarkhaja
  • 297
  • 2
  • 4