Architecture

Kiến trúc củ hành (Onion Architecture)

Onion Architecture được đặt ra bởi Jeffrey Palermo vào năm 2008. Như tôi thấy, nó được xây dựng dựa trên Kiến trúc Ports & Adapters với ý đồ đặt domain vào trung tâm ứng dụng, mở rộng cơ chế phân phối (UI) và cơ sở hạ tầng được sử dụng bởi hệ thống (ORM, công cụ tìm kiếm, các API của bên thứ ba, …). Nhưng nó đi xa hơn và thêm một số layers bên trong vào nó.

Chúng ta đã đi từ Layered Architecture với 4 layer (Presentation, Application, Domain, Persistence) đến Ports và Adapters Architecture mà chỉ ngầm đề cập đến hai layer chủ đạo:

  • Một layer bên ngoài đại diện cho cơ chế phân phối (delivery mechanisms) và cơ sở hạ tầng (infrastructure);
  • Một layer nội bộ đại diện cho business logic.

Cả Ports & AdaptersOnion Architecture đều chia sẻ ý tưởng cô lập core ứng dụng ra khỏi mối quan tâm về cơ sở hạ tầng bằng cách viết mã adapter để mã cơ sở hạ tầng không rò rỉ vào lõi ứng dụng. Điều này làm cho nó dễ dàng hơn để thay thế cả các công cụ và các cơ chế phân phối được sử dụng bởi các ứng dụng, chống lại sự thay đổi về công nghệ, công cụ và các bên thứ 3 (vendor).

Nó cũng cung cấp cho ứng dụng khả năng vận hành dễ dàng mà không cần cơ sở hạ tầng thực tế cũng như các cơ chế phân phối vì chúng có thể được thay thế bằng các kỹ thuật mocking, làm cho việc test trở nên dễ dàng.

Tuy nhiên, Onion Architecture cũng cho chúng ta biết rằng, trong các enterprise applications, chúng ta sẽ có nhiều hơn hai layer (internal và external) đó, nó thêm một số layer trong business logic mà chúng ta có thể nhận ra từ Domain Driven Design:

2008-onion-architecture5

Hơn nữa, nó làm rõ ra chiều phụ thuộc (direction of dependencies) giữa các layer:

  • Layer phía ngoài phụ thuộc vào layer phía trong (Outer layers depend on inner layers);
  • Layer phía trong không hề biết về layer phía ngoài (Inner layers do not know about outer layers).

Điều này có nghĩa hướng của sự phụ thuộc (coupling) hướng về trung tâm, nơi lõi ứng dụng không phụ thuộc vào bất cứ gì. Chúng ta có sự linh hoạt của việc có thể thay đổi các layer bên ngoài mà không ảnh hưởng đến các layer bên trong, và quan trọng hơn. Nó sử dụng Nguyên tắc đảo ngược phụ thuộc (Dependency Inversion Principle), ở cấp độ kiến trúc.

Các nguyên lý chính của Onion Architecture:

  • Ứng dụng được xây dựng xung quanh một object model độc lập
  • Các layer bên trong định nghĩa các interfaces. Các layer bên ngoài implement các interface đó
  • Chiều của sự phụ thuộc (Direction of coupling) hướng tới trung tâm
  • Tất cả mã lõi của ứng dụng có thể được biên dịch và chạy tách biệt với cơ sở hạ tầng

 

  • The application is built around an independent object model
  • Inner layers define interfaces. Outer layers implement interfaces
  • Direction of coupling is toward the center
  • All application core code can be compiled and run separate from infrastructure

Jeffrey Palermo 2008, The Onion Architecture: part 3

Ngoài ra, bất kỳ layer bên ngoài nào cũng có thể gọi trực tiếp bất kỳ layer bên trong, không phá vỡ hướng kết nối và tránh tạo ra các proxy method hoặc thậm chí proxy class không có business logic, chỉ vì mục đích tuân thủ một vài sơ đồ phân lớp (layering scheme). Điều này cũng được khuyến nghị bởi Martin Fowler.

[…] các layers bên trên có thể sử dụng bất kỳ layer bên dưới chúng, không chỉ là layer ngay bên dưới.

[…] the layers above can use any layer beneath them, not just the layer immediately beneath.

Jeffrey Palermo 2008, The Onion Architecture: part 3

Kết luận

Onion Architecture được xây dựng trên Ports & Adapters Architecture để thêm một số tổ chức nội bộ vào business logic của ứng dụng dựa trên một vài khái niệm Domain Driven Design.

Một lần nữa, đây là một sự tiến triển trong việc phân tách trách nhiệm (segregating responsibilities), nhằm tạo nên tính low coupling and high cohesion, tạo điều kiện dễ dàng cho phát triển, kiểm thử và bảo trì.

Đây là bài viết trong loạt bài viết về “Tổng quan về sự phát triển của kiến trúc phần mềm“. Đây là loạt bài viết chủ yếu giới thiệu về một số mô hình kiến trúc phần mềm hay nói đúng hơn là sự phát triển của chúng qua từng giai đoạn, qua đó giúp chúng ta có cái nhìn tổng quát, up-to-date và là roadmap để bắt đầu hành trình chinh phục (đào sâu) thế giới của những bản thiết kế với vai trò là những kỹ sư và kiến trúc sư phần mềm đam mê với nghề.

Bài viết được tham khảo từ:

Onion Architecture

Đọc thêm:

2002 – Martin Fowler – Patterns of Enterprise Application Architecture

2008 – Jeffrey Palermo – The Onion Architecture: part 1

2008 – Jeffrey Palermo – The Onion Architecture: part 2

2008 – Jeffrey Palermo – The Onion Architecture: part 3

2013 – Jeffrey Palermo – The Onion Architecture: part 4 – After Four Years

Tổng hợp bởi edwardthienhoang

 

1 thought on “Kiến trúc củ hành (Onion Architecture)”

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.