Post

C# | Clean Architecture

Clean Architecture is a software design philosophy that aims to create systems that are independent of frameworks and libraries. It focuses on separating concerns and creating a clear separation of responsibilities, making the codebase easier to understand, maintain, and test.

Principles of Clean Architecture

Clean Architecture is based on several key principles:

  1. Independence of Frameworks: The core business logic should not depend on the details of any specific framework or technology.

  2. Testability: The architecture should facilitate easy testing of the application’s business rules without requiring external dependencies.

  3. Independence of UI: The user interface should be decoupled from the core business logic. This allows for easier changes to the UI without affecting the underlying system.

  4. Independence of Database: The database implementation details should not leak into the core business logic. This allows for easier changes to the database technology if needed.

  5. Separation of Concerns: The architecture should clearly separate different concerns, such as business logic, presentation, and data access.

Components of Clean Architecture

Clean Architecture typically consists of the following layers:

  1. Entities: These represent the business objects or entities in the application. They encapsulate the core business logic and are independent of any external concerns.

  2. Use Cases: Also known as Interactors or Application Services, use cases contain the application-specific business rules and orchestrate the flow of data between entities and external systems.

  3. Interfaces (Adapters): Interfaces define contracts between the application core and external systems, such as databases, user interfaces, or third-party services. Adapters implement these interfaces to interact with external systems.

  4. Frameworks and Drivers: This layer consists of external frameworks, libraries, and tools, such as web frameworks, UI libraries, and database drivers. These are the outermost layers and are responsible for interacting with the outside world.

Example in C#

Let’s illustrate the Clean Architecture principles with a simple C# example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
// Entity
public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
}

// Use Case
public class ProductService
{
    public IEnumerable<Product> GetProducts()
    {
        // Logic to retrieve products from a data store
        return new List<Product>();
    }

    public void SaveProduct(Product product)
    {
        // Logic to save product to a data store
    }
}

// Interface (Repository)
public interface IProductRepository
{
    IEnumerable<Product> GetProducts();
    void SaveProduct(Product product);
}

// Adapter (Repository Implementation)
public class ProductRepository : IProductRepository
{
    public IEnumerable<Product> GetProducts()
    {
        // Implementation to retrieve products from a database
        return new List<Product>();
    }

    public void SaveProduct(Product product)
    {
        // Implementation to save product to a database
    }
}

In this example, Product represents the entity, ProductService acts as the use case, IProductRepository defines the interface, and ProductRepository is the adapter implementing the repository interface.

What Next?

Clean Architecture with .NET promotes maintainable and testable software by emphasizing separation of concerns and independence of external dependencies. By adhering to its principles, developers can create robust and flexible applications that are easier to maintain and evolve over time.

This post is licensed under CC BY 4.0 by the author.