2009-05-19 15 views
6

Tôi đang viết một ứng dụng nghe kết nối mạng và khi một số dữ liệu đến, nó trả lời và tùy thuộc vào dữ liệu đến, có thể cần hỏi người dùng (hiển thị hộp thoại) trước khi trả lời lại.Làm cách nào để có được đầu vào của người dùng từ giữa phương thức của mô hình trong kiến ​​trúc Model-View-Viewmodel?

Tôi không biết cách làm điều này một cách rõ ràng trong kiến ​​trúc MV-VM: các sự kiện và ràng buộc với các bộ sưu tập quan sát được tốt đẹp nếu tôi cần cập nhật GUI dựa trên dữ liệu đến, nhưng nếu tôi thực sự cần một anwer từ người dùng trước khi trả lời lại?

Và để làm mọi thứ tồi tệ hơn, tôi muốn thực hiện đồng bộ, vì tôi muốn thuật toán trả lời của mình ở cùng một nơi, không được phân đoạn thành nhiều cuộc gọi lại với trách nhiệm 'ai-gọi-ai' không rõ ràng.

đơn giản, một cái gì đó giống như

HandleMessage(Message msg){ 
    string reply; 
    if (msg.type == 1) { 
     reply = ... 
    } else { 
     string question = msg... 
     reply = ShowModalDialog(question); // MVVM violation! 
    } 
    sender.Send(reply); 
} 

nhưng tôi không muốn gọi xem hoặc viewmodel từ mô hình, như mô hình cần phải được tái sử dụng và kiểm chứng - Tôi không muốn popping hộp thoại trong mọi chạy thử nghiệm, và nó sẽ vi phạm MVVM! Không có sự kiện (chúng chỉ là một chiều theo như tôi biết, và không có kênh ngược lại để trả lời nguồn gốc sự kiện) hoặc databinding, vì nó sẽ không đồng bộ.

Điều này có thể thực hiện được không? Đây là một câu hỏi mà tôi đã hỏi một vài người tuyên truyền phát triển thử nghiệm, và cho đến nay, tôi đã không nhận được câu trả lời thực tế có thể sử dụng được. Tuy nhiên, một nhu cầu cho một số đầu vào bổ sung ở giữa chế biến là khá phổ biến.

Cảm ơn! EDIT: đây là logic ứng dụng, vì vậy nó rõ ràng thuộc về mô hình, và ngay cả khi trong trường hợp này nó không, tôi muốn biết các giải pháp cho các trường hợp khi tôi thực sự cần đầu vào của người dùng ở giữa doanh nghiệp thói quen logic trong mô hình.

Trả lời

3

Đây là một trong những vấn đề mà MVVM không tự giải quyết. Một giải pháp sẽ là sử dụng một dịch vụ để truy vấn người dùng và sau đó có ViewModel sử dụng dịch vụ đó.

Trong dự án của mình, chúng tôi đang sử dụng PRISM ngoài việc cung cấp một khung dịch vụ cũng cung cấp các công cụ khác giúp việc phát triển GUI trở nên dễ dàng hơn.

Here's cách viết các dịch vụ hoạt động như thế nào trong PRISM. Vì vậy, cụ thể trong trường hợp của bạn, tôi sẽ tạo một số loại IOC, đăng ký một dịch vụ truy vấn với nó, sau đó trong Pass ViewModel trong IOC và sau đó sử dụng IOC để nhận dịch vụ truy vấn và sử dụng nó để truy vấn người dùng . Nhiều công việc hơn? Chắc chắn rồi.Nhưng điều đó có nghĩa là bạn có thể thay thế dịch vụ truy vấn bằng một triển khai khác để thử nghiệm bằng cách thay thế nó trong IOC.

MVVM + Services = Ultimate Power!

+0

1 để giải thích nó tốt hơn rất nhiều so với tôi đã làm. –

+0

Cảm ơn, điều này nghe có vẻ như một giải pháp sạch sẽ, tôi sẽ đọc các liên kết (cảm ơn họ!) –

0

Thực ra, nó không TẤT CẢ thuộc về logic ứng dụng.

Dường như bạn có 2 "chế độ xem" khác nhau. Có một cái đầu tiên (dữ liệu đến qua mạng), và dữ liệu thứ hai (hộp thoại xác nhận).

Mô hình cần xác định rằng chế độ xem mới cần được hiển thị, báo hiệu chế độ xem để hiển thị nó, sau đó phản hồi lại đầu vào từ chế độ xem đó.

Đừng cố gắng làm tất cả trong một bước.

+0

Tôi đồng ý với nhận xét đầu tiên - có, chế độ xem ban đầu chỉ là cửa sổ nhật ký bảng điều khiển của dịch vụ và hộp thoại nhập dữ liệu có thể được coi là chế độ xem khác. Hovewer, mô hình là thuật toán điều khiển, và tôi thấy nó khá điên rồ khi phải phân chia một alorithm thành các phần không đồng bộ được gọi là UI - và trong một số trường hợp, nó không thực sự khả thi. Ngoài ra, từ quan điểm bảo trì, tốt hơn là nên có một thuật toán trong một metod. Do đó, gọi tới GUI phải đồng bộ. –

+0

Tôi hiểu chính xác ý bạn là gì. Tôi đã phải sử dụng máy nhà nước ở một số nơi thực sự khó chịu. Mặc dù tôi biết bạn không muốn đến đó, nhưng bạn sẽ có cơ hội tốt. Nếu không, tuyệt vời, nhưng bạn có thể muốn mull nó hơn - đó có thể là những gì bạn sẽ kết thúc làm. Một hộp thoại thường ngụ ý giải phóng chuỗi. Tôi sẽ không đồng ý với quan điểm của bạn rằng nó là điên mặc dù :) –

1

Tôi không biết ý tưởng này có tuân thủ nghiêm ngặt các nguyên lý của MVVM hay không, nhưng ... Tôi sẽ đóng gói chức năng của hộp thoại dưới dạng dịch vụ (được tham chiếu qua giao diện). Việc thực hiện dịch vụ sẽ nằm trong lớp giao diện người dùng, nhưng đối với mục đích thử nghiệm, bạn sẽ chỉ "chế nhạo" giao diện.

Các vấn đề liên quan