Software development

Onion Architecture in ASP NET Core

By March 18, 2021 February 2nd, 2023 No Comments

A curated list of awesome articles, videos, and other resources to learn and practice software architecture, patterns, and principles. This isn’t possible with a totally different database. Instead, we must schedule a job to write the changes after the transaction has committed. The scheduling itself must be done within the transaction, so I like to view this as just writing to another read store which is later queried by a job processor. When the job is executed, the changes have already been made, so we cannot throw an error when processing the job. The job must therefore be processed with a retry mechanism to ensure it completes.

onion architecture

With Onion Architecture, the game-changer is that the Domain Layer is at the Core of the Entire Application. This means higher flexibility and lesser coupling. In this approach, we can see that all the Layers are dependent only on the Core Layers. The GET request for the DeleteUser action method returns _DeleteUser partial View.

Our Solutions

The practice has shown that 90 percent of requests concern get operations; as a rule, they are small and quick. 10 percent of requests concern put operations; these operations are usually complicated due to a range of transactions and validations. To put it simply, every action in Web API is either a request or a command , but it shouldn’t do both.

This way we define the purpose of each of the layer perfectly and in long run this architecture will be able to handle future maintenance elegantly. These interfaces communicate between UI and data access logic. As it communicates via interfaces, it builds applications that are loosely coupled. This project represents the Service layer of the onion architecture. The domain layer lies in the heart of the Onion Architecture, representing the business and behavioral objects. All of your domain objects should be located at this core.

onion architecture

There are several traditional architectures that exists in web world and each one of the architecture comes with its pros and cons. But most of the traditional architectures raises fundamental issues like tight coupling and separation of concerns. I am going to talk about issues faced with traditional designs and then we will see how Onion Architecture addresses these common issues. I’ve spoken several times about a specific type of architecture I call Onion Architecture. Inward moving, we encounter the Domain Services layer. In this layer is where the majority of our business logic lives, it carries out the operations to turn A into B, input into output, egg into chicken.

The Onion Architecture : part 1

In a microservices architecture, the external API libraries may reference another micro-service. We still want to avoid circular dependencies at this higher level, so this gives our whole system architecture a flow of dependency, with core services on the right hand side of our diagram. The outermost layer integrates our application with the outside world, such as networks, databases or a message bus. We’d most likely see a persistence project here, responsible for implementing our IRepository interfaces.

Instead of building a highly decoupled structure, we often end up with several layers that are depending on each other. This is something really bad in building scalable applications and may pose issues with the growth of the codebase. To keep it clear, in the above diagram we can see that the presentation layer depends on the logics layer, which in turn depends on the data access and so on. It is an ASP.NET Core Web application in this sample but it could be a Unit Test or Web API project.


Putting business-specific rules in a centralized place is something suggested by both Clean and Onion Architecture. Although they use different names for very similar concepts, they both encourage us to think about business logic in the same way. As we have seen, all three architectural styles share the principles of loose coupling and attempt to minimize moving parts by properly layering the application. In practical scenarios, you would actually want both EFCore and RAW SQL Queries for optimal performance. While ADO.NET is super fast, it’s very ideal for long queries with tons of joins.

The obvious advantage of the Onion architecture is that our controller’s methods become very thin. This is the true beauty of the Onion architecture. We moved all of the important business logic into the Service layer.

  • This way we define the purpose of each of the layer perfectly and in long run this architecture will be able to handle future maintenance elegantly.
  • We could create an EntityFrameworkRepository that implements our business logic’s port and wraps up Entity Framework’s DbSet.
  • Well, let us move on to the next section to find out.
  • You have made it clear and simple though yet not confident with it because I know the coding part will be application-specific and hence will differ here and there.
  • Domain-Driven Design centres on the domain model that has a rich understanding of the processes and rules of a domain.

However, the flexibility with technology upgrades doesn’t come handy with tightly coupled systems. If you have been using web forms to develop web application then adopting MVC architecture even fits better, because it provides the required framework to build web apps MVC way. But things doesn’t turn out as planned and leads to very tight coupling between UI and business logic and business logic to database logic. This is because you end up writing all of your logic in server side code (mainly aspx.cs files). This scenario produces very tight coupling over the period of time and system becomes a nightmare to maintain. This means they can be more easily replaced if needed.

More from Expedia Group Technology

Onion Architecture was introduced by Jeffrey Palermo to provide a better way to build applications in perspective of better testability, maintainability, and dependability. Onion Architecture addresses the challenges faced with 3-tier and n-tier architectures, and to provide a solution for common problems. Onion architecture layers interact to each other by using the Interfaces. C# programmers are drawn to Onion Architecture due to the dependency flows. If you are interested in learning more C# while working with the Onion Architecture, visit the TechRepublic Academy.

onion architecture

Domain Layer – It is the core of Onion architecture. This layer contains application entities and DB model classes which works independently. Business Logic is likely the main piece of this whole arrangement. It holds all the rationale connected with the Business prerequisites.

When to Apply Onion Architecture?

If you were to cut from the outside to the centre of your onion diagram, then bend the edges upwards, you’d have the same diagram as for n-tier, for example. The answer is, as always, “it depends”, but I would argue the extra abstraction onion architecture layer is definitely worth the effort for projects of sufficient size and scope. Also validation clutters the code of controllers, should be moved to a separate class (because of OOP+SRP which are the foundational principles behind CQRS).

The first layer around the Domain Model is typically where we would find interfaces that provide object saving and retrieving behavior, called repository interfaces. The object saving behavior is not in the application core, however, because it typically involves a database. Out on the edges we see UI, Infrastructure, and Tests.

Add this topic to your repo

Consequently, each API method is divided into requests and commands. The main issues we faced were related to maintaining the low connectivity of microservices. That’s why it was difficult to immediately divide the functionality into the necessary microservices. The system can be quickly tested because the application core is independent. DDD implies that you distinguish a certain bounded context, which is a set of entities tightly connected with each other but minimally connected with other entities in your system.

Do We Need Every Layer?

Diego Rodrigues is a Software Engineer at Avenue Code. He has a soft spot for all kinds of design, creative solutions, and philosophy. When we use Onion Architecture, we start with the central layer, the core.

The strategy is to make interfaces defined in the domain layer and put the implementation in Infrastructure layer. Following this principle makes sure we have loose coupling between layers and a real implementation comes only at real time. The central layer — the domain model — contains all business rules. At the next level are domain services, which are like contracts of repositories and other dependencies.

In this article, we are going to learn about Onion architecture and what are its advantages. We will build a RESTful API that follows the Onion architecture, with ASP.NET Core and .NET 5. The application is separated into layers, each with its own duties and concerns. Within the application, each layer functions as a module/package/namespace. Because all the code depends on deeper layers or the center, it offers superior maintainability.

Leave a Reply