Tôi đã đọc rất nhiều về mẫu đơn và mức độ "xấu" của nó bởi vì nó làm cho các lớp sử dụng nó khó kiểm tra nên không nên tránh. Tôi đã đọc một số bài viết giải thích làm thế nào singleton có thể được thay thế bằng tiêm phụ thuộc, nhưng nó có vẻ phức tạp không cần thiết đối với tôi.
Đây là vấn đề của tôi chi tiết hơn một chút. Tôi đang xây dựng một ứng dụng di động bằng React Native và tôi muốn tạo một ứng dụng khách REST sẽ giao tiếp với máy chủ, nhận dữ liệu, đăng dữ liệu và xử lý đăng nhập (lưu mã thông báo đăng nhập và gửi nó với mỗi yêu cầu sau khi đăng nhập).
Kế hoạch ban đầu của tôi là tạo một đối tượng đơn lẻ (RESTClient) mà ứng dụng của tôi sẽ sử dụng ban đầu để đăng nhập và sau đó thực hiện yêu cầu gửi thông tin đăng nhập khi cần. Cách tiếp cận DI có vẻ rất phức tạp đối với tôi (có thể vì tôi chưa bao giờ sử dụng DI trước đây) nhưng tôi đang sử dụng dự án này để tìm hiểu càng nhiều càng tốt nên tôi muốn làm những gì tốt nhất ở đây. Bất kỳ đề xuất và ý kiến được nhiều đánh giá cao.
Chỉnh sửa: Bây giờ tôi đã nhận ra rằng tôi đã trả lời câu hỏi của tôi rất kém. Tôi muốn có một số hướng dẫn về cách tránh mẫu singleton trong RN và tôi thậm chí có nên làm điều đó không. May mắn thay Samuel đã cho tôi loại câu trả lời tôi muốn. Vấn đề của tôi là tôi muốn tránh mô hình singleton và sử dụng DI, nhưng có vẻ rất phức tạp khi thực hiện nó trong React Native. Tôi đã thực hiện một số nghiên cứu sâu hơn và thực hiện nó bằng hệ thống bối cảnh Reacts.
Đối với bất cứ ai quan tâm đây là cách tôi đã làm nó. Như tôi đã nói, tôi đã sử dụng bối cảnh trong RN giống như đạo cụ nhưng nó được truyền xuống mọi thành phần.
Trong thành phần gốc tôi cung cấp các phụ thuộc cần thiết như thế này:
export default class Root extends Component {
getChildContext() {
restClient: new MyRestClient();
}
render() {...}
}
Root.childContextTypes = {restClient: PropTypes.object};
Bây giờ restClient có sẵn trong tất cả các thành phần bên dưới Root. Tôi có thể truy cập nó như thế này.
export default class Child extends Component {
useRestClient() {
this.context.restClient.getData(...);
}
render() {...}
}
Child.contextTypes = {restClient: PropTypes.object}
Điều này có hiệu quả di chuyển việc tạo đối tượng ra khỏi logic và tách riêng việc thực hiện ứng dụng khách REST khỏi các thành phần của tôi.