Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Onion Architecture: Business Services Interfaces and Implementation

I am learning about the Onion Architecture. I have a confusion about the service layer, because I see some people saying that the core layer should only contain:

  • Models
  • Repository interfaces
  • Services interfaces

But others express that it also should implement the services interfaces. So what layer should implement the services interfaces?

I thought that the infrastructure layer should implement:

  • Repository Interfaces
  • Services Interfaces

And inject them to UI layer and Test layer when requested.

Thank you!

like image 249
reliasr Avatar asked May 31 '13 15:05

reliasr


People also ask

What is an onion architecture?

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.

What is service layer in onion architecture?

Now we create the third layer of the onion architecture which is a service layer. To build this layer, we create one more class library project named OA. Service. This project holds interfaces and classes which have an implementation of interfaces. This layer is intended to build loosely coupled applications.

Where does business logic go in onion architecture?

According to Jeffrey Palermo: "The overall philosophy of the Onion Architecture is to keep your business logic and model in the middle (Core) of your application and push your dependencies as far outward as possible.

What is onion architecture in .NET core?

The Onion architecture is a form of layered architecture and we can visualize these layers as concentric circles. Hence the name Onion architecture. The Onion architecture was first introduced by Jeffrey Palermo, to overcome the issues of the traditional N-layered architecture approach.


1 Answers

The core layer should contain:

  • Models/Entities/POCOs/Whatever_the_name... it's all about domain objects
  • ALL the interfaces (including repositories and services)
  • Your core business services implementation (*)

(*) If your business is about handling orders, then the implementation of your IWorkOrderService should be in the core layer. If your WorkOrderService needs to access let's say a ShippingService (which is not your business), then it will only manipulate the IShippingService defined in the core layer and the IShippingService implementation will be somewhere in the infrastructure layer.

If your WorkOrderService needs an OrderRepository it will be done excatly the same way.

Here's a code example:

namespace MyBusiness.Core.Services
{
  internal class WorkOrderService: IWorkOrderService
  {
    public WorkOrderService(IOrderRepository orderRepository, IShippingService shippingService)
    {
      _orderRepository = orderRepository;
      _shippingService = shippingService;
    }

    ...
  }
}

This will be up to the outermost layer of your onion architecture - the Dependency Resolution Layer - to bound all your interfaces with the right service implementation at run time.

For<IWorkOrderService>().Use<Core.Services.WorkOrderService>();
For<IShippingService>().Use<Infrastructure.Services.ShippingService>();
For<IOrderRepository>().Use<Infrastructure.Data.OrderRepository>();
like image 182
MaxSC Avatar answered Oct 10 '22 06:10

MaxSC