Kiến trúc Monolithic trong ứng dụng ASP.NET Core

Kiến trúc Monolithic trong ứng dụng ASP.NET Core

Kiến trúc phần mềm là gì?

Trong ngành công nghiệp phần mềm, khi chúng ta muốn phát triển một sản phẩm phần mềm thì chúng ta cần kiến trúc tốt bằng cách sử dụng kiến trúc đó, chúng ta có thể phát triển một sản phẩm chất lượng cao, sản phẩm có khả năng kiểm tra cao, khả năng mở rộng cao và khả năng bảo trì cao.

Định nghĩa

“Kiến trúc phần mềm đơn giản là tổ chức của hệ thống, tổ chức này bao gồm tất cả các thành phần và cách chúng sẽ tương tác với nhau với môi trường mà chúng hoạt động và các nguyên tắc được sử dụng để xây dựng ứng dụng. Trong nhiều trường hợp, nó thường mang nghĩa sự phát triển của sản phẩm phần mềm trong tương lai”

Kiến trúc phần mềm được thiết kế với sứ mệnh cụ thể rằng sản phẩm phải có khả năng kiểm thử cao, có khả năng mở rộng và bảo trì cao, đồng thời hành vi và cấu trúc của phần mềm phải tuân theo tiêu chuẩn và mang lại cho chúng ta kết quả tốt nhất có thể

Kiến trúc phần mềm trong kỹ thuật phần mềm

Kiến trúc phần mềm trong công nghệ phần mềm trình bày cấu trúc của hệ thống. Kiến trúc tập trung vào các thành phần của hệ thống và mối quan hệ của chúng và cách các thành phần này sẽ tương tác với nhau và mang lại cho chúng ta sản phẩm phần mềm với chất lượng tốt nhất

Kiến trúc nguyên khối (Monolithic) là gì?

Kiến trúc nguyên khối (monolithic) là mô hình truyền thống trong thiết kế các sản phẩm phần mềm, kiến trúc nguyên khối có nghĩa là kết hợp ứng dụng thành một đơn vị (khối) và các thành phần ứng dụng được liên kết chặt chẽ với nhau và phụ thuộc lẫn nhau (nghĩa là để ứng dụng chạy trơn tru các thành phần đó phải có mặt)

Ứng dụng nguyên khối là ứng dụng một tầng, nghĩa là nhiều thành phần của ứng dụng được kết hợp thành một ứng dụng lớn duy nhất và kiến trúc của ứng dụng được kết hợp chặt chẽ

Trong ứng dụng Nguyên khối nếu chúng ta muốn thay đổi một thành phần thì các thành phần phụ thuộc khác cũng yêu cầu viết lại các đoạn code sau khi thay đổi, ứng dụng của chúng ta cần được biên dịch lại. Hơn nữa, chúng ta chạy đi chạy lại quy trình kiểm tra và chúng ta lặp lại quy trình này sau mỗi lần thay đổi. Toàn bộ quá trình làm tăng chi phí và hạn chế sự linh hoạt và tốc độ của quá trình phát triển sản phẩm phần mềm

Hiểu kiến trúc nguyên khối với sản phẩm phần mềm

Giả sử chúng ta có ứng dụng cung cấp dịch vụ cho người dùng cuối và các dịch vụ này như Cyber Security, Khoa học dữ liệu, Phát triển phần mềm và Kỹ thuật DevOps, đồng thời các dịch vụ có thể được bán cho người dùng cuối theo các tiêu chí nhất định và người dùng cuối trả tiền cho dịch vụ sử dụng phương thức thanh toán trực tuyến và trong ứng dụng, chúng ta cung cấp thông tin đăng nhập của người dùng và lịch sử giao dịch, lịch sử dự án và trong dự án, chúng ta có tính năng cuộc gọi video trực tuyến sẽ được sử dụng để xử lý cuộc gọi giữa các kỹ sư và tất cả các bên liên quan của dự án

Các thành phần của ứng dụng có thể được liệt kê như sau:

  • Authentication
  • Services
  • Video Calling
  • Online Payments
  • Reports
  • Jira Project API Integration

Giả sử rằng chúng ta phát triển các dự án như vậy bằng cách sử dụng kiến trúc nguyên khối mang lại cho chúng ta sản phẩm được kết hợp chặt chẽ và xem xét dự án trên nếu chúng ta muốn thay đổi mô-đun Authentication thì các thành phần khác phụ thuộc vào mô-đun này sau khi thay đổi, thành phần phụ thuộc cần viết lại chức năng được sử dụng để duy trì trạng thái của người dùng và vì một thay đổi mà chúng ta cần kiểm tra lại toàn bộ ứng dụng và toàn bộ quá trình này làm tăng chi phí và thời gian phát triển và có thể làm giảm hiệu quả của ứng dụng

Nếu cần thay đổi một thành phần, thì các thành phần bị ảnh hưởng phụ thuộc khác cũng cần được thay đổi

 Lợi ích của ứng dụng nguyên khối

  • Ứng dụng nguyên khối có thể có thông lượng tốt hơn ứng dụng mô-đun.
  • Một ứng dụng nhỏ với ít mô-đun hơn sẽ dễ kiểm tra và gỡ lỗi hơn từ đó có thể giảm chi phí phát triển
  • Kiến trúc nguyên khối tốt hơn cho các ứng dụng nhẹ quy mô nhỏ

Hạn chế của ứng dụng nguyên khối

  • Kiến trúc nguyên khối không phù hợp với các ứng dụng phức tạp.
  • Khi độ phức tạp của ứng dụng tăng lên thì quy mô nhóm phát triển cũng tăng theo.
  • Codebase của ứng dụng thường sẽ khó hiểu và khó sửa đổi
  • Đối với bất kỳ ứng dụng nguyên khối nào, nhà phát triển cần kiểm tra và triển khai toàn bộ ứng dụng sau một thay đổi nhỏ.
  • Với ứng dụng nguyên khối, chi phí và thời gian phát triển cũng tăng theo những thay đổi trong cấu trúc ứng dụng.
  • Các ứng dụng nguyên khối hạn chế về khả năng mở rộng và độ tin cậy
  • Một module nhỏ, lớn có thể khiến cả ứng dụng bị sập.

Triển khai kiến trúc nguyên khối

Trong kiến trúc Monolithic, tất cả logic của ứng dụng được kết hợp thành một dự án duy nhất được biên dịch trong một assembly duy nhất và được triển khai như một đơn vị duy nhất. Trong một ứng dụng nguyên khối, chúng ta có một dự án duy nhất chứa tất cả logic về nghiệp vụ, truy cập dữ liệu trong một ứng dụng như được hiển thị trong cấu trúc dự án bên dưới

Để phân tách các mối quan tâm, chúng tôi tuân theo cấu trúc thư mục mặc định, ở đây chúng ta có design pattern MVC. Tiếp theo chúng ta thực hiện các đoạn code và có cấu trúc như sau

Data Folder

Thêm thư mục Data trong lớp infrastructure sử dụng để thêm lớp database context. Database context được sử dụng để duy trì phiên làm việc với cơ sở dữ liệu bên dưới mà bạn có thể thực hiện thao tác CRUD. Trong dự án của chúng tôi, chúng tôi sẽ thêm lớp StoreContext sẽ quản lý phiên làm việc với cơ sở dữ liệu của chúng tôi.

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; 
using Skinet.Core.Entities;
using Skinet.Core.Entities.OrderAggregate; 
using System;
using System.Linq;
using System.Reflection;
namespace Skinet.Infrastracture.Data
{
    public class StoreContext : DbContext
    {
        public StoreContext(DbContextOptions<StoreContext> options) : base(options) {}
        public DbSet<Products> Products { get; set; }
        public DbSet<ProductType> ProductTypes { get; set; } 
        public DbSet<ProductBrand> ProductBrands { get; set; } 
        public DbSet<Order> Orders { get; set; }
        public DbSet<DeliveryMethod> DeliveryMethods { get; set; }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
           base.OnModelCreating(modelBuilder); 
           modelBuilder.ApplyConfigurationsFromAssembly(Assembly.GetExecutingAssembly()); 
           if(Database.ProviderName =="Microsoft.EntityFramework.Sqlite")
           {
               foreach (var entity in modelBuilder.Model.GetEntityTypes())
               {
                 var properties = entity.ClrType.GetProperties()
                             .Where(p => p.PropertyType == typeof(decimal));
                 var dateandtimepropertise = entity.ClrType.GetProperties()
                             .Where(t => t.PropertyType == typeof(DateTimeOffset)); 
                 foreach (var property in properties)
                 {
                     modelBuilder.Entity(entity.Name).Property(property.Name)
                              .HasConversion<double>();
                 }
                 foreach (var property in dateandtimepropertise)
                 {
                     modelBuilder.Entity(entity.Name).Property(property.Name)
                              .HasConversion(new DateTimeOffsetToBinaryConverter());
                  }
                }
            }
        }
    }
}

Models

Trước tiên, bạn cần thêm thư mục Models sẽ được sử dụng để tạo các thực thể cơ sở dữ liệu. Trong thư mục Models, chúng tôi sẽ tạo các thực thể cơ sở dữ liệu sau

namespace MonolithicApplication.Models
{
   public class Employee
   {
     public int Id { get; set; }
     public string Name { get; set; } 
     public string Address { get; set; } 
     public string Country { get; set; }
   }
}

Controllers

Bộ điều khiển được sử dụng để xử lý yêu cầu HTTP. Bây giờ chúng ta cần thêm Student Controller sẽ tương tác với lớp dịch vụ của chúng ta và hiển thị dữ liệu cho người dùng.

Services Folder

Thư mục này sẽ được sử dụng để thêm các service vào hệ thống của chúng tôi và cho phép chúng tôi tạo một số service tùy chỉnh cho dự án của mình. Tất cả các custom service sẽ triển khai giao diện ICustomService, chúng tôi sẽ thêm Thao tác CRUD vào hệ thống của mình.

View Folder

Trong thư mục View, chúng tôi viết code giao diện hiển thị dữ liệu cho người dùng

Tóm tắt

Nếu chúng ta muốn phát triển một ứng dụng nhỏ, thì kiến trúc phù hợp nhất là nguyên khối. Nhưng nếu chúng ta muốn phát triển một ứng dụng phức tạp thì chúng ta cần kiến trúc microservice hoặc bất kỳ kiến trúc nào khác tách rời ứng dụng.


Bài viết thuộc các danh mục

Bài viết được gắn thẻ



BÌNH LUẬN (0)

Hãy là người đầu tiên để lại bình luận cho bài viết !!

Hãy đăng nhập để tham gia bình luận. Nếu bạn chưa có tài khoản hãy đăng ký để tham gia bình luận với mình


Bài viết liên quan

Kiến trúc 3 tầng trong ứng dụng ASP.NET Core

Trong chương này, chúng ta sẽ xem xét kiến trúc ba lớp và cách kết hợp Data Access Layer và Business Access Layer vào một dự án, cũng như cách các lớp này tương tác với nhau. Kiến trúc ba lớp đang chia dự án thành ba lớp nơi chúng ta phân tách giao diện người dùng, logic và dữ liệu thành ba phần

Kiến trúc "Củ hành" (Onino Architecture)

Trong chương này, chúng tôi sẽ đề cập đến kiến trúc Onion sử dụng ứng dụng Web API. Thuật ngữ kiến trúc Onion do Jeffrey Palermo giới thiệu vào năm 2008, kiến trúc này cung cấp cho chúng ta một cách tốt hơn để xây dựng các ứng dụng bằng cách sử dụng kiến trúc này, các ứng dụng của chúng ta có thể dễ dàng kiểm tra hơn, có thể bảo trì và đáng tin cậy trên các cơ sở hạ tầng như cơ sở dữ liệu và các service.

Copyright © 2022. Bảo lưu tất cả quyền