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:
- 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. - 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.
- 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 choEntity Framework
. - Hỗ trợ Bulk Operations: Cung cấp các phương thức
Bulk Create
,Bulk Update
, vàBulk Delete
choEntity Framework
. - 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ã. - 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
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ặcBulk
. - 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!