architecturesoftware-designonion-architecturehexagonal-architecture

Onion architecture compared to hexagonal


Is there any difference between them (onion | hexagonal), from my understanding they are just the same, they focus upon the domain which is at the core of the application and should be technology / framework agnostic.

What are the differences between them if any ?

Also I see no real advantage on using one over the other or even against an N-layered architecture, if done bad just following any of them won't make any difference

What are the benefits of using one over the other and why you would use it ? when to use it?


Solution

  • What are the differences between them if any?

    Onion: There are layers, with the dependencies always pointing inwards, i.e., a layer can use any of the layers inside it. The inner layer is Domain Model and the outer is infrastructure, but the number of layers between may vary.

    Hexagonal (it's an alternative name for the original name "Ports & Adapters"): There are no layers. You have the application, the ports, and the adapters. The ports belong to the application, they are the API/SPI of the application. Adapters are outside the application, and each one depends on a port of the application.

    The confusion some people have is that when implementing the hexagonal architecture, most of the people don't physically put every adapter in their own artifact, but they put all adapters together into one artifact (like the infrastructure layer). And also they make adapters depend on the whole app, not just the port they use. So it would be an Onion in fact.

    Implementing hexagonal right should separate adapters from each other, and every adapter should depend just on the port it uses/implements (depending on whether the port is a driver or driven).

    Another difference is that Hexagonal says nothing about the structure of the inside of the hexagon (the application).

    What are the benefits of using one over the other?

    The benefit of hexagonal is that it is more modular, you have a clear separation of components, preventing the leaking of code between them. Onion, on the other hand, is more dangerous in that sense, as you can access for example the database directly from the UI (they both belong to the same layer).

    The benefit of Onion is derived from the above. As hexagonal have a lot of artifacts, if the project is big, the build of the whole project should take a lot of time.

    Why you would use it? When to use it?

    The point of using either of them is that you focus on the real problem you are trying to solve, without using any technology or framework. The application is technology agnostic, and it is easy to migrate from a framework to another. Both of them are called "clean" architectures because of that. You have your application core free of framework code, annotations, etc.

    So... Why use them?

    Because you improve maintainability, testability, and you have clean code.

    When to use them?

    I should rather say when not to use them. If the app you are developing is not complex, for example, it's just a CRUD, maybe it doesn't deserve to use them.

    Personally, I like "Ports and Adapters" over the others.

    Hope my explanation helped.