洋蔥架構

一、什麼是洋蔥架構

洋蔥架構(Onion Architecture)是由Jeffrey Palermo提出的一種軟件架構模式,用於實現可擴展、可維護和可測的應用程序。

它的基本思想是將應用程序分為多個層,每個層都依賴於下一層,並通過依賴注入實現。

這種層次結構就像一個洋蔥,每一層都像是裹在洋蔥外層的一層,通過不斷向內擴展,就能構建出一個穩定、可擴展的應用程序架構。

二、洋蔥架構的結構

洋蔥架構可以分為四個主要的層:

1. UI層

UI層是應用程序的用戶接口部分,可以是Web應用、桌面應用或移動設備應用。

UI層負責與用戶交互,接收用戶輸入,向外部系統顯示信息、狀態等。但它並不負責任何業務邏輯,它只是將請求轉發給下一層。

2. 應用程序層

應用程序層包含應用程序的業務邏輯和應用程序流程。它接收由UI層傳遞過來的請求,將數據處理後傳遞到下一層。

應用程序層中的方法需要具備可復用性,它們應該是獨立的,這樣可以在其它應用程序中重複使用。

3. 領域層

領域層定義了業務邏輯和實體。它是業務處理的核心,包含了業務邏輯的實現代碼。

領域層的主要作用是封裝所有與業務相關的代碼,並對外表現出一套乾淨、簡單的接口。因此它需要與具體的技術實現解耦,以便於將來的維護和替換。

4. 基礎設施層

基礎設施層提供了應用程序所需的所有支持,例如數據庫、文件系統、網絡連接和郵件等。

基礎設施層負責將領域層和外部系統連接起來,它是業務邏輯和外部系統之間的橋樑,為領域層提供必要的支持。

三、洋蔥架構的優點

洋蔥架構的優點主要有以下幾點:

1. 可擴展性

由於每個層都是獨立的,它們之間的耦合很鬆散,容易擴展。可以在每個層中添加更多的組件或邏輯,而不影響其它層的功能。

2. 可測試性

洋蔥架構可以很容易地進行單元測試、集成測試和功能測試,因為每個層都是可測試的。

3. 可維護性

由於業務邏輯封裝在領域層中,所以更容易進行維護、修復和升級。

4. 可重用性

由於每個層都是獨立的,因此它們可以在多個項目中重複使用。

四、示例代碼

1. 用戶服務接口

public interface IUserService
{
    bool ValidateUserCredentials(string username, string password);
    User GetUserById(int id);
    IEnumerable GetAllUsers();
    void CreateUser(User user);
}

2. 用戶服務實現

public class UserService : IUserService
{
    private readonly IUserRepository userRepository;

    public UserService(IUserRepository userRepository)
    {
        this.userRepository = userRepository;
    }

    public bool ValidateUserCredentials(string username, string password)
    {
        return userRepository
            .GetUserByUsername(username)?
            .Password
            .Equals(password) ?? false;
    }

    public User GetUserById(int id)
    {
        return userRepository.GetUserById(id);
    }

    public IEnumerable GetAllUsers()
    {
        return userRepository.GetAllUsers();
    }

    public void CreateUser(User user)
    {
        userRepository.CreateUser(user);
    }
}

3. 用戶倉儲接口

    public interface IUserRepository
    {
        User GetUserById(int id);
        IEnumerable GetAllUsers();
        void CreateUser(User user);
        User GetUserByUsername(string username);
    }

4. 用戶倉儲實現

public class UserRepository : IUserRepository
{
    private readonly ApplicationDbContext context;

    public UserRepository(ApplicationDbContext context)
    {
        this.context = context ?? throw new ArgumentNullException(nameof(context));
    }

    public User GetUserById(int id)
    {
        return context.Users.FirstOrDefault(u => u.Id == id);
    }

    public IEnumerable GetAllUsers()
    {
        return context.Users.ToList();
    }

    public void CreateUser(User user)
    {
        context.Users.Add(user);
        context.SaveChanges();
    }

    public User GetUserByUsername(string username)
    {
        return context.Users.FirstOrDefault(u => u.Username.Equals(username, StringComparison.OrdinalIgnoreCase));
    }
}

5. 控制器

[ApiController]
public class UserController : ControllerBase
{
    private readonly IUserService userService;

    public UserController(IUserService userService)
    {
        this.userService = userService;
    }

    [HttpPost]
    [Route("api/users")]
    public IActionResult CreateUser([FromBody] CreateUserRequest request)
    {
        var user = new User { Username = request.Username, Password = request.Password };
        userService.CreateUser(user);
        return Ok();
    }

    [HttpGet]
    [Route("api/users")]
    public IActionResult GetAllUsers()
    {
        var users = userService.GetAllUsers();
        var userDtos = users.Select(u => new UserDto { Id = u.Id, Username = u.Username });
        return Ok(userDtos);
    }

    [HttpGet]
    [Route("api/users/{id}")]
    public IActionResult GetUserById(int id)
    {
        var user = userService.GetUserById(id);
        var userDto = new UserDto { Id = user.Id, Username = user.Username };
        return Ok(userDto);
    }

    [HttpPost]
    [Route("oauth/token")]
    public IActionResult GetToken([FromBody] GetTokenRequest request)
    {
        if (userService.ValidateUserCredentials(request.Username, request.Password))
        {
            return Ok(new { AccessToken = "dummyAccessToken" });
        }
        else
        {
            return Unauthorized();
        }
    }
}

原創文章,作者:CQCRV,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/334551.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
CQCRV的頭像CQCRV
上一篇 2025-02-05 13:05
下一篇 2025-02-05 13:05

相關推薦

  • pythoncs架構網盤client用法介紹

    PythonCS是一種使用Python編寫的分佈式計算中間件。它具有分佈式存儲、負載均衡、任務分發等功能。pythoncs架構網盤client是PythonCS框架下的一個程序,主…

    編程 2025-04-28
  • FCOS3D架構詳解

    一、什麼是FCOS3D FCOS3D是基於深度學習的三維目標檢測框架。該框架主要解決需要在三維空間內檢測物體的問題,它不僅可以對物體進行2D的檢測,同時可以確定物體的3D坐標和大小…

    編程 2025-04-25
  • 從多個方面詳細闡述MVC模式和三層架構

    一、MVC模式 MVC是Model-View-Controller的縮寫,是一種應用於軟件工程的設計模式。MVC模式將一個軟件應用分為三個基本部分:模型(Model)、視圖(Vie…

    編程 2025-04-24
  • Kubernetes和Kafka在微服務架構中的應用

    一、Kubernetes和Kafka的基本介紹 Kubernetes是Google開源的容器集群管理系統,用於自動化部署、擴展和管理容器化應用程序。它簡化了容器的部署和管理,使得應…

    編程 2025-04-23
  • 從多個方面探析IoT架構

    一、IoT架構基礎 IoT(物聯網)架構的核心在於通過物聯網平台將各種物聯網設備、系統、數據等連接在一起,進行統一管理、控制、協議轉換、數據轉換和數據分析等工作,實現信息的物理化、…

    編程 2025-04-23
  • Dubbo架構詳解

    一、Dubbo簡介 Dubbo是一種高性能、輕量級的開源Java RPC框架,主要用於支持分佈式服務的協議。由阿里巴巴公司開發並開源,已作為Apache孵化項目得以許多投入,因其高…

    編程 2025-04-23
  • MPP架構:從多個方面詳細闡述

    一、MPP架構簡介 MPP全稱為Massively Parallel Processing,翻譯過來就是大規模並行處理,是一種高性能、高可擴展性的數據存儲和處理架構。MPP架構是對…

    編程 2025-04-22
  • 多租戶saas架構詳解

    一、什麼是多租戶saas架構 多租戶(saas)是指在一個應用程序中,通過相同的代碼和結構支持多個客戶,也就是說,一套系統中可以自由添加多個租戶,每個租戶擁有獨立的資源和數據。簡單…

    編程 2025-04-18
  • Android 架構詳解

    一、概述 Android 系統是由 Google 開發並發佈的基於 Linux 內核的開源移動設備操作系統。由於 Android 設備逐漸成為主流智能手機和平板電腦的操作系統,因此…

    編程 2025-04-18
  • LTE網絡架構

    一、LTE網絡的概述 LTE(Long Term Evolution),即「長期演進」,是第四代移動通信技術,是目前移動通信領域中最先進、最成熟的技術之一。與3G相比,LTE速度更…

    編程 2025-04-12

發表回復

登錄後才能評論