Sử dụng ASP.NET Core trên nền tảng .NET 8 để phát triển một công cụ tạo mã QR trực tuyến
Ngày cập nhật: 2024-08-11 | Lượt xem: 1703 | Số từ: 882 | Phân loại: Windows
Tìm kiếm
Trong quá trình làm việc hàng ngày, tôi thường xuyên phải tải lên các ứng dụng Android đã phát triển lên máy chủ đám mây và sau đó tạo mã QR từ đường dẫn tải xuống, gửi cho khách hàng để tiện lợi trong việc quét mã và cài đặt. Trước đây, tôi sử dụng dịch vụ QrCode của CaoLiao, dù nó đáp ứng được nhu cầu cơ bản nhưng thao tác hơi rườm rà. Chính vì vậy, tôi muốn tận dụng dịp tự học .NET 8 để vừa rèn luyện kỹ năng, vừa xây dựng một công cụ tạo mã QR trực tuyến đơn giản, hiệu quả. Đây cũng là cách giúp tôi thư giãn sau những giờ làm việc căng thẳng.
Tôi đã dành khoảng một tuần để hoàn thiện dự án này, mỗi ngày chỉ làm tối đa 30 phút. Kết quả cuối cùng khá hài lòng, cảm nhận chung là việc phát triển với ASP.NET Core MVC trên nền tảng .NET 8 khá dễ chịu. Tuy nhiên, tài liệu chính thức còn chưa rõ ràng, cần tìm hiểu nhiều nguồn khác nhau. Về sách vở thì phần lớn không có hệ thống hướng dẫn từng bước chi tiết, mà chủ yếu là nội dung rút gọn hoặc phân tích lại từ tài liệu gốc. Vì vậy, tôi nghĩ rằng viết một bộ giáo trình hướng dẫn lập trình cơ bản cho .NET 8 sẽ có tiềm năng rất lớn trên thị trường.
- Phiên bản tiếng Trung: Máy tạo mã QR
- Phiên bản tiếng Anh: Qrcode Generator
Hỗ trợ đa ngôn ngữ (i18n)
Một lý do khiến tôi quyết định chọn .NET 8 là vì trước đây khi sử dụng các framework như golang gin hay rust axum, khả năng hỗ trợ i18n gần như bằng không. Tôi phải tự xây dựng các giải pháp, ví dụ như bài viết tôi từng tổng hợp về “Hỗ trợ quốc tế hóa website đa ngôn ngữ với golang gin”. Dù có thể dùng được, nhưng trong thực tiễn vẫn gặp nhiều bất tiện. Ví dụ, khi chức năng tăng lên, bạn sẽ thấy khó khăn trong việc quản lý các bản dịch riêng biệt cho từng tính năng. Ngược lại, .NET lại phân tách các bản dịch theo từng trang vào các tập tin tài nguyên riêng biệt, điều này nhìn chung ban đầu có vẻ phức tạp nhưng lâu dài lại rất khoa học.
Điểm bất tiện duy nhất là hiện tại Visual Studio chưa hỗ trợ trích xuất tự động văn bản ra file tài nguyên như Android Studio. Việc code cứng văn bản không gây cảnh báo nào, cho thấy Microsoft dường như chưa nhấn mạnh vấn đề này. Chi tiết hơn về cách triển khai, bạn có thể tham khảo tài liệu chính thức về I18N trong ASP.NET Core trên nền tảng .NET 8.
Triển khai (Deployment)
Tôi từng thử nghiệm phương án triển khai AOT của .NET, bạn có thể xem thêm ở bài viết cũ:
DotNet 8 Minimal API với AOT (Phần 3): Triển khai môi trường sản phẩm trên Ubuntu Server
Tuy nhiên, nếu tính đến wwwroot và các tệp cấu hình, thì phương án này vẫn kém tiện lợi so với việc triển khai dưới dạng một file duy nhất của golang. Với golang, bạn có thể sử dụng go embed.FS
để đóng gói toàn bộ template và tài nguyên tĩnh vào một file nhị phân, nhưng hiện tại tôi chưa tìm thấy giải pháp tương tự nào trên .NET. Thậm chí với Rust, tôi cũng chưa thấy có cách nào thật sự đơn giản như thế.
Vì vậy, việc triển khai không sử dụng AOT cũng không quá tệ. Hiện tại, quy trình triển khai dự án MVC .NET 8 của tôi như sau:
- Sử dụng lệnh
dotnet publish
để tạo thư mục chứa tệp triển khai. - Đồng bộ thư mục này sang máy chủ Ubuntu thông qua
rsync
. - Trên server, dùng
systemctl
để khởi động lại dịch vụ dotnet.
Lo lắng duy nhất của tôi là việc một số phiên bản Ubuntu cũ có thể không hỗ trợ runtime .NET 8. May mắn là máy chủ Ubuntu của tôi thấp nhất cũng là 18.04, và vẫn có Docker sẵn sàng. Nếu cần thiết, mình có thể triển khai qua Docker.
Phát triển thuần bằng VIM, không cần Visual Studio
Sau khi tạo mới một dự án MVC .NET 8 bằng .NET CLI, bạn hoàn toàn có thể tiếp tục phát triển dự án bằng VIM mà không gặp bất kỳ trở ngại nào – thậm chí không cần Visual Studio.
Tuy nhiên, tôi vẫn chưa quen thuộc lắm với .NET CLI, nên chưa tìm được lệnh tạo trực tiếp các thành phần như:
- Razor Page
- Controller MVC
- Tập tin tài nguyên cho i18n
Việc tạo thủ công cũng không quá khó, nhưng rõ ràng thiếu đi sự tiện lợi và chuyên nghiệp. Có lẽ sẽ cần phải tạo ra các lệnh tùy chỉnh riêng. Tôi sẽ tiếp tục nghiên cứu sâu hơn về vấn đề này.
Tham khảo thêm về .NET CLI tại đây