Tôi đang sử dụng mẫu Trình bày mẫu xem (MVP) như được mô tả trong giấy Hộp thoại khiêm tốn (pdf) với dự án MFC. Tôi chắc chắn rằng vấn đề này giống với hầu hết các bộ công cụ GUI.
Điều khiến tôi bận tâm là quan điểm cụ thể (nghĩa là lớp hộp thoại) đang tạo ra không chỉ người trình bày mà còn cả các dịch vụ mà người trình bày cần. Điều đó có bình thường không? Tại sao quan điểm cần biết những dịch vụ mà người trình bày cần? Điều tôi đang nghĩ là tôi nên phụ thuộc vào người thuyết trình vào lớp hộp thoại.
Điều khiển chính cho ứng dụng là một lớp có nguồn gốc từ CWinApp. Vì vậy, tôi nên xây dựng các dịch vụ và người trình bày trong lớp này và sau đó đưa chúng vào lớp hộp thoại?
Mặc dù làm thế nào tôi phụ thuộc vào việc chèn người trình bày vào lớp hộp thoại khi người trình bày cần một tham chiếu đến lớp khung nhìn trong hàm tạo của nó?
MyPresenter(IView *view, MyService *service);
Ngoài ra, nếu cửa sổ chính xuất hiện một cửa sổ bật lên, thì các chi tiết cho người trình bày và dịch vụ của cửa sổ đó sẽ được xây dựng ở đâu?
Vì đây là C ++, tôi không nghĩ rằng tôi quan tâm đến bất kỳ loại khung DI nào.
CẬP NHẬT
Một ý tưởng tôi có là xây dựng người trình bày với chế độ xem null, hàm tạo đưa người trình bày vào lớp hộp thoại và sau đó, trong hàm tạo của lớp hộp thoại gọi một SetView(IView *view)
phương thức trên người trình bày với this
nơi this
sẽ là lớp hộp thoại (xuất phát từ IView ). Vì thế:
MyApp::Start()
{
SomeService *service = new SomeService();
MyPresenter *presenter = new MyPresenter(null, service);
MyDialog *dialog = new MyDialog(presenter);
...
}
MyDialog::MyDialog(MyPresenter *presenter):
presenter_(presenter)
{
presenter_->SetView(this);
}
Có vẻ hơi ít nhưng giữ cho việc xây dựng dịch vụ ra khỏi lớp Hộp thoại. Chế độ xem null có vẻ hơi nguy hiểm. Một cách khác là thực sự xây dựng một lớp NullView có các thân phương thức trống và sau đó chuyển nó vào hàm tạo của người trình bày.