Step by Step implementing Onion architecture in ASP NET MVC Application Dhananjay Kumar

Now we can develop our project using onion architecture for API Development OR MVC Core Based projects. The biggest offender is the coupling of UI and business logic to data access. However, the flexibility with technology upgrades doesn’t come handy with tightly coupled systems. As of now we have created the controller using the model and data context class. Next we need to create instance of BloodDonorInitalizeDb class and set the database. We need to write this code inside the global.asax .

Spring Modulith Structures Spring Boot 3 Applications with Modules and Events –

Spring Modulith Structures Spring Boot 3 Applications with Modules and Events.

Posted: Wed, 16 Nov 2022 04:02:39 GMT [source]

It provides better testability as the unit test can be created for separate layers without an effect of other modules of the application. When a class is dependent on a concrete dependency, it is said to be tightly coupled to that class. A tightly coupled object is dependent on another object; that means changing one object in a tightly coupled application, often requires changes to a number of other objects. It is not difficult when an application is small but in an enterprise-level application, it is too difficult to make the changes. Now we need to add the student controller that will interact will our service layer and display the data to the users.

If we apply the principles of the Onion Architecture to the layered architecture, we need to turn the layer diagram upside down. Standardized interfaces between layers usually confine the effect of code changes to the layer that is changed. The service has dependency on the repository type which is injected at run time using Castle Windsor and all the methods works on the repository type to perform specific actions.


This project can save well over200+ hoursof development time for your team. However, I have covered a few of these topics in other articles in my blog already. You could go through them to understand the core concepts and to learn how everything works. Just to make our solution a bit clean, let’s also add API Versioning to the WebAPI. With the CRUD logic out of the way, let’s set up EFCore in the Persistence Layer and try to generate a database.

Outer layer -UI and Infrastructure change often and easy to upgrade, migrate and easy to maintain. Infrastructure layer act as adapter to external sources that make it easy to plug and play for any datasource. For e.g Infrastructure is a place where we house entity framework and repository pattern etc.

So, we should stick to writing services which deal with encapsulating repositories calls as well as handle business logic. 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. Infrastructure Layer– this is the outermost layer of onion architecture which deals with Infrastructure needs and provides the implementation of your repositories interfaces. In other words, this is where we hook up the Data access logic or logging logic or service calls logic. The repository layer act as a middle layer between the service layer and model objects. We will maintain all the database migrations and database context Objects in this layer.

Onion Architecture In ASP.NET Core With CQRS

Drilling down deeper into the domain layer makes this issue more apparent. The LayerProductionApplicationService uses a set of Domain Services. Onion Architecture sets a clear dependency rule between layers, making it a more restrictive variant of Layered and Hexagonal Architectures. At the very center of our application sits a domain model, surrounded by domain services and application services.

Advantages of onion architecture

We have to realize that everything is a tradeoff in software engineering. Conceptually, we can consider that the Infrastructure and Presentation layers are on the same level of the hierarchy. The Onion architecture is also commonly known as the “Clean architecture” or “Ports and adapters”. These architectural approaches are just variations of the same theme. Hello, I am a .Net architect working for a very very very wealthy company in the USA. My gut instinct is, they will understand and welcome this initiative.

Project Structure.

To implement the Onion architecture, we develop an ASP.NET Core application. This application performs CRUD operations on entities. The application holds four projects as per figure 2. Each project represents a layer onion structure in onion architecture. The layer holds interfaces which are used to communicate between the UI layer and repository layer. It holds business logic for an entity so it’s called the business logic layer as well.

Elsewhere you had mentioned that adding repositories increases lines of code and yes, it does; however, “number of lines of code” is useless as a quality metric. Coupling between components and between layers is a much better quality heuristic, and onion architecture is all about managing that coupling. As mentioned earlier, the Core Layers will never depend on any other layer. Therefore what we do is that we create interfaces in the Application Layer and these interfaces get implemented in the external layers. This is also known as DIP or Dependency Inversion Principle. Let’s look at one of the most popular Architecture in ASP.NET Core Applications.

Extensible, Customizable Integration Solutions

We are depending on abstractions at compile-time, which gives us strict contracts to work with, and we are being provided with the implementation at runtime. All of the layers interact with each other strictly through the interfaces defined in the layers below. The flow of dependencies is towards the core of the Onion. We will explain why this is important in the next section. I just wonder and want to know why all the samples we found with Entity framework?

Advantages of onion architecture

This WebAPI Solution Primarily consists of the following .csproj files. However, in if we take Onion combined with MVC kind of use case, then we can inject the View as an interface into controller. He doesn’t advocate mixing, but technically, since both are in the same layer, you could, although you shouldn’t.

Implementing MediatR for CRUD Operations

Let’s see what each of these layers represents and what should each contain. Keeping BloodDonorRepository class in your Inftrastructure layer is wrong. Infrastructure layer shall not contain any Business Logic.

  • Create a new class Entities/Product.cs in the Domain Project.
  • Similar to the Application layer, we will have to create a new class just to register the dependencies and services of this layer to the service container.
  • With onion architecture you have layers, but layers can be further split, and within layer the general rule is that, horizontal dependencies aren’t allowed.
  • To pass the data from UI to a controller to edit a user, use same view model named UserViewModel.
  • The code snippet mentioned below is for the same action method for both GET and Post requests.

Thus, we create generic repository interface for the entity operations, so that we can develop loosely coupled application. The code snippet, mentioned below is for the IRepository interface. It holds POCO classes along with configuration classes. It represents the Domain Entities layer of the onion architecture. To achieve this, we adopted helper classes designed to implement a number of interfaces that in turn setup various functions to be queried against. The Onion.Factory sample is a very simple Domain Driven Design application which follows the onion architecture pattern.

However, there are still a couple of things to take care of. Presentation project and configure them with the framework. They are going to be treated the same as if they were defined conventionally. We did not see how to wire up any of our dependencies.

Not easy to understand for beginners, learning curve involved. Architects mostly mess up splitting responsibilities between layers. Here, the DefaultConnection is connection string which defined in appsettings.json file as per following code snippet. For every service, we will write the CRUD operation using our generic repository. After Adding the DbSet properties we need to add the migration using the package manager console and run the command Add-Migration.


The newly introduced Core still has a dependency outgoing. In order to get rid of this dependency we would need to introduce a small abstraction defined by the needs of the Core. As we can see, there is a bunch of translation from top to bottom and from bottom to top going on. As long as only data is transferred the mapping process is tedious but manageable. As soon as the presentation layer would like to reuse business rules from the core domain model this approach’s drawbacks outweigh its benefits.

None of the layer stand independent, which raises separation of concerns. Use dependency injection to resolve repository interface to the concrete repository class object at the run time using the unity container. Onion architecture consists of several concentric layers interacting with each other towards the core, which is the domain. The architecture does not depend on the data layer, as in a traditional three-tier architecture; it depends on real domain models. The popularity of microservices is growing due to the range of benefits they offer to developers and businesses. In this article, I will tell you about my experience of using onion architecture with a harmonized combination of DDD, ASP.NET Core Web API and CQRS for building microservices.

The idea is that the domain model behind it represents a factory which produces onions . In order to be able to create onion, a factory responsible for creating onions must be created first. The presentation layer entry point is the LayerProductionPresenter. The LayerProductionPresenter uses the ILayerProductionApplicationService to open a factory and produces layers by using the previously opened factory. Because the application follows the strict layering pattern, the process layer has to translate domain objects into data transfer objects residing in the process layer .

Such systems are very hard to understand and maintain. The drawback of this traditional architecture is unnecessary coupling. Onion Architecture is based on the inversion of control principle. Onion Architecture is comprised of multiple concentric layers interfacing each other towards the core that represents the domain.

Leave a Reply