Tôi đã có một yêu cầu tương tự trước đây và tôi đã lưu trữ tài nguyên trong tệp .resx nhưng tôi đã quyết định sử dụng các lớp để lưu trữ khóa.
Ví dụ: giả sử tôi có tài nguyên cho màn hình rút tiền ngân hàng.
Tôi đã tạo ra một lớp đơn giản trên các dòng
public class BankingWithdrawalResource
{
public string WithdrawFunds { get; set; }
}
Sau đó tôi đã thực hiện một lớp để lấy tài nguyên. Mục tiêu của tôi là có một cách đánh máy mạnh mẽ để rút tài nguyên. Tôi cũng muốn làm cho đơn vị truy xuất tài nguyên có thể kiểm tra được. Tôi đã trích xuất một giao diện để truy xuất tài nguyên : IResource
.
Mỗi lần tôi muốn sử dụng tài nguyên, tôi sẽ có một triển khai thông qua bộ chứa IoC.
var resource = Dependency.Resolve<IResource>();
Cuối cùng, khi nói đến việc sử dụng tài nguyên, tôi sẽ có vài thứ trên dòng:
resource.For<BankingWithdrawalResource>(p => p.WithdrawFunds)
Trong dòng trên, tôi đã sử dụng biểu thức lambda cho phép tôi xem tất cả các tài nguyên có sẵn thông qua intellisense.
Khi nói đến thử nghiệm đơn vị, tôi sẽ chế giễu IResource
và đặt kỳ vọng vào nó.
Ví dụ:
resourceMock.Expect(a => a.For<BankingWithdrawalResource>(p => p.WithdrawFunds)).Repeat.Once();
Cũng lưu ý rằng chúng tôi đã trích xuất một giao diện để lấy tài nguyên. Vì điều này, giờ đây chúng tôi có thể lưu trữ tài nguyên ở bất cứ đâu chúng tôi muốn. Ví dụ:
public class DatabaseResource : IResource
{
// Logic to retrieve resources from database
// Won't cause recompilation
}
public class XmlResource : IResource
{
// Logic to retrieve resources from xml files
}
public class DefaultResource : IResource
{
// Will cause recompilation as resources are stored in .resx
}
Tôi đã viết ở trên từ đầu của tôi trong notepad, vì vậy nếu bạn có bất kỳ vấn đề gì hãy cho tôi biết và tôi sẽ thêm thực hiện sau.