I. Localization with .resx
Cách tốt nhất để tạo và sử dụng tệp Resources/AppStrings.resx là thông qua Visual Studio (hoặc Rider) để tận dụng tính năng tạo lớp truy cập chuỗi (Strongly-Typed Resource Accessor) tự động. Phức tạp và rắc rối hơn Java, bên Java chỉ cần file text .properties và nội dung là name = value.
File mặc định sẽ là English, có thể đặt tên AppStrings.en.resx, Restful nên dùng IStringLocalizer
- AppStrings.resx
- AppStrings.de.resx
- AppStrings.fr.resx
- AppStrings.it.resx
| Cách | Đề xuất | Ưu điểm | Nhược điểm |
|---|---|---|---|
| IStringLocalizer + Factory | Có | hỗ trợ DI, tự động culture | Cần config chút |
IStringLocalizer<T> | Có | Rất sạch, dễ test | Phải tạo class dummy |
| Strongly-typed class | Không | Intellisense tốt | Phải set Culture thủ công |
| ResourceManager | Không | Không cần DI | Cũ, khó test |
Cách dùng thì có 4 cách nhưng khuyến khích 2 cách đầu
- Add thư mục
Resourcesvàocontext, chứ không mặc định nhưJavavà set default language trongstartup.cs
II. Extension Methods
Extension Method (Phương thức mở rộng):
Là một loại phương thức đặc biệt trong C# (và .NET) cho phép bạn thêm các phương thức mới vào một lớp (class), cấu trúc (struct), hoặc giao diện (interface) hiện có mà không cần phải:
- Sửa đổi mã nguồn gốc của lớp đó.
- Tạo lớp con kế thừa từ lớp đó.
- Biên dịch lại lớp gốc.
using System;
using System.Text.RegularExpressions;
// Step 1: Create a static class
public static class StringExtensions {
// Step 2: Create a static method with 'this' keyword
public static bool IsEmail(this string input) {
if (string.IsNullOrWhiteSpace(input)) {
return false;
}
string pattern = @"^[^@\s]+@[^@\s]+\.[^@\s]+$";
return Regex.IsMatch(input.Trim(), pattern);
}
// Another useful extension: Capitalize first letter
public static string Capitalize(this string input) {
if (string.IsNullOrEmpty(input)) {
return input;
}
return char.ToUpper(input[0]) + input.Substring(1).ToLower();
}
}
Cách Dùng
class Program {
static void Main() {
string email = "john.doe@example.com";
string name = "hello world";
// These methods don't exist in System.String, but we can call them!
Console.WriteLine(email.IsEmail()); // True
Console.WriteLine("bad-email".IsEmail()); // False
Console.WriteLine(name.Capitalize()); // Hello world
// Works with null (be careful!)
string nullString = null;
Console.WriteLine(nullString.IsEmail()); // False (no NullReferenceException)
}
}