0
0
Lập trình
Admin Team
Admin Teamtechmely

Tạo REST Controller Chức Năng Đầy Đủ Chỉ Với 1 Dòng Trong .NET

Đăng vào 5 ngày trước

• 3 phút đọc

Giới thiệu

Trong thế giới phát triển ứng dụng web, việc tạo ra các API hiệu quả và dễ bảo trì là một thách thức lớn. Với sự phát triển của nền tảng .NET, đặc biệt là .NET 6 trở lên, việc phát triển WebAPI đã trở nên dễ dàng hơn bao giờ hết. Bài viết này sẽ giới thiệu về một thư viện giúp giảm thiểu mã nguồn cần viết khi phát triển ứng dụng bằng .NET, cho phép tạo REST Controller đầy đủ chức năng chỉ với một dòng mã.

Thư viện Tạo REST Controller

Thư viện mà chúng tôi phát triển nhằm mục đích đơn giản hóa quy trình tạo REST API. Dưới đây là một số điểm nổi bật của thư viện này:

  1. Hỗ trợ nhiều công nghệ: Thư viện cho phép sử dụng bất kỳ công nghệ nào để làm việc với dữ liệu bền vững, chẳng hạn như Entity Framework, Dapper, v.v., nhờ vào các interface tách biệt.
  2. Tương thích với Swagger: Tự động hiển thị mọi tham số Swagger, giúp việc tài liệu hóa API trở nên dễ dàng hơn.
  3. Cài đặt các phương thức mặc định: Thư viện cung cấp các phương thức Create, Update, và Delete mặc định cho Entity Framework.
  4. Hỗ trợ Bulk Operations: Cung cấp các phương thức Bulk Create, Bulk Update, và Bulk Delete cho Entity Framework.
  5. Tạo Controller chỉ với một dòng: Cho phép tạo bất kỳ loại controller nào như ReadOnly, FullCRUD, hoặc thậm chí Bulk chỉ với một dòng mã.
  6. Hỗ trợ gRPC: Thư viện cũng cung cấp cách sử dụng các lớp Manager với dịch vụ gRPC, giúp dễ dàng chuyển đổi từ REST sang gRPC.

Tạo REST Controllers Chỉ Với 1 Dòng

Dưới đây là ví dụ về cách cấu hình WebAPI với thư viện này:

csharp Copy
private void ConfigureWebApi(IServiceCollection services)
{
    services.AddSwaggerGen();
    ServiceProvider provider = services.BuildServiceProvider();
    Assembly stationControllerAssembly = services.AddSimplifiedAutoController<StationEntity, Guid, EmptyAdditionalFilters>(
                provider.GetRequiredService<ModelContext>(), "Station",
                ControllerType.FullCrud, null, provider.GetRequiredService<ILoggerFactory>());
    Assembly measureUnitControllerAssembly = services.AddSimplifiedAutoController<MeasureUnitEntity, Guid, EmptyAdditionalFilters>(
                provider.GetRequiredService<ModelContext>(), "MeasureUnit",
                ControllerType.ReadOnly, null, provider.GetRequiredService<ILoggerFactory>());
    Assembly sensorControllerAssembly = services.AddSimplifiedAutoController<SensorEntity, Guid, EmptyAdditionalFilters>(
                provider.GetRequiredService<ModelContext>(), "Sensor",
                ControllerType.FullCrud, null, provider.GetRequiredService<ILoggerFactory>());
    Assembly measurementControllerAssembly = services.AddSimplifiedAutoController<MeasurementEntity, Guid, EmptyAdditionalFilters>(
                provider.GetRequiredService<ModelContext>(), "Measurement",
                ControllerType.Bulk, null, provider.GetRequiredService<ILoggerFactory>());

     services.AddControllers().AddApplicationPart(sensorControllerAssembly).AddControllersAsServices();
     services.AddControllers().AddApplicationPart(stationControllerAssembly).AddControllersAsServices();
     services.AddControllers().AddApplicationPart(measureUnitControllerAssembly).AddControllersAsServices();
     services.AddControllers().AddApplicationPart(measurementControllerAssembly).AddControllersAsServices();
}

Giải thích Mã Nguồn

  • DbContext: Bạn cần truyền vào DbContext từ Entity Framework, cho phép sử dụng bất kỳ cơ sở dữ liệu nào như Postgres, MySql, SqlServer, v.v.
  • Tên Controller: Chỉ định tên controller mà không cần thêm hậu tố "Controller".
  • Loại Controller: Chọn giữa ReadOnly, FullCrud, hoặc Bulk.
  • Chức năng Lọc: Chức năng lọc có thể là null nếu không cần.
  • ILoggerFactory: Để tạo ra log trong các controller.

Một yêu cầu duy nhất là mỗi lớp thực thể phải triển khai IModelIdentifiable<T> với thuộc tính public T Id {get;set;}.

Những Điều Cần Lưu Ý

Việc sử dụng controller một dòng giúp đơn giản hóa logic, nhưng cũng có một số nhược điểm. Chúng ta không có các đối tượng DTO, mặc dù IModelManager tổng quát đã cung cấp. Nếu bạn muốn thêm các phương thức tùy chỉnh vào controller của mình, bạn sẽ phải tạo một lớp controller mới bằng tay, điều này cũng rất đơn giản chỉ với khoảng 10 dòng mã. Việc xác thực và phân quyền có thể được thêm vào thông qua các thuộc tính, nhưng hiện tại chưa hỗ trợ trong các controller một dòng (chờ đợi các bản phát hành mới).

Kết Luận

Thư viện này được phát triển bởi tác giả và công ty TNHH của ông. Chúng tôi cũng cung cấp dịch vụ phát triển phần mềm doanh nghiệp chất lượng. Nếu bạn thấy giải pháp của chúng tôi hữu ích, đừng quên cho chúng tôi một ngôi sao trên GitHub!

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào