Gần đây tôi đã suy nghĩ về việc bảo mật một số mã của mình. Tôi tò mò làm cách nào để đảm bảo một đối tượng không bao giờ có thể được tạo trực tiếp mà chỉ thông qua một số phương thức của một lớp nhà máy. Giả sử tôi có một số lớp "đối tượng nghiệp vụ" và tôi muốn đảm bảo rằng bất kỳ phiên bản nào của lớp này sẽ có trạng thái bên trong hợp lệ. Để đạt được điều này, tôi sẽ cần thực hiện một số kiểm tra trước khi tạo một đối tượng, có thể là trong phương thức khởi tạo của nó. Tất cả đều ổn cho đến khi tôi quyết định rằng tôi muốn biến séc này trở thành một phần của logic nghiệp vụ. Vì vậy, làm cách nào để tôi có thể sắp xếp một đối tượng nghiệp vụ chỉ có thể được tạo thông qua một số phương thức trong lớp logic nghiệp vụ của tôi mà không bao giờ trực tiếp? Mong muốn tự nhiên đầu tiên là sử dụng từ khóa "bạn bè" cũ tốt của C ++ sẽ không thành công với C #. Vì vậy, chúng tôi cần các tùy chọn khác ...
Hãy thử một số ví dụ:
public MyBusinessObjectClass
{
public string MyProperty { get; private set; }
public MyBusinessObjectClass (string myProperty)
{
MyProperty = myProperty;
}
}
public MyBusinessLogicClass
{
public MyBusinessObjectClass CreateBusinessObject (string myProperty)
{
// Perform some check on myProperty
if (true /* check is okay */)
return new MyBusinessObjectClass (myProperty);
return null;
}
}
Tất cả đều ổn cho đến khi bạn nhớ rằng bạn vẫn có thể tạo phiên bản MyBusinessObjectClass trực tiếp mà không cần kiểm tra đầu vào. Tôi muốn loại trừ hoàn toàn khả năng kỹ thuật đó.
Vậy, cộng đồng nghĩ gì về điều này?