2009-05-19 18 views
6

Bir ağ bağlantısını dinleyen bir uygulama yazıyorum ve bazı veriler geldiğinde, geri dönüyor ve gelen verilere bağlı olarak, geri göndermeden önce kullanıcıya (göster iletişim kutusu) sorması gerekebilir.Model-View-Viewmodel mimarisindeki model yönteminin ortasından nasıl kullanıcı girişi temizlenir?

MV-VM mimarisinde bunu nasıl temizleyeceğimi bilmiyorum: GUI'yi gelen verilere dayanarak güncellemem gerekirse, gözlemlenebilir koleksiyonlara bağlanma ve etkinlikler güzel, ancak eğer gerçekten bir anwer'e ihtiyacım varsa kullanıcı geri cevap vermeden önce?

Ve işleri daha da kötüleştirmek için, eşzamanlı olarak yapmak istiyorum, çünkü yanıt algoritmamın tek bir yerde olmasını istiyorum, belirsiz 'kim-çağrıları-kim' sorumlulukları olan birden çok geri bildirime bölünmemiş.

Basitçe,

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

ama böyle bir şey manken yeniden kullanılabilir ve test edilebilmelidir olarak, modelden görünüm veya ViewModel aramak istemiyorum - Her deney vadede diyaloglar haşhaş istemiyoruz ve MVVM ihlali olurdu! Hiçbir olay (bunlar bildiğim kadarıyla tek yönlüdür ve olay kaynağına yanıt almak için geriye dönük bir kanala sahip değildirler) veya eşzamanlı olamayacağı için veri bağlamaya gerek duymazlar.

Bu yapılabilirlik? Bu, birçok test odaklı geliştirme propagandasında sorduğum bir soru ve şu ana kadar pratik olarak kullanılabilecek bir cevap alamadım. Yine de, işlemin ortasında bazı ek girdilere duyulan ihtiyaç oldukça yaygındır.

Teşekkürler!

DÜZENLEME: Bu uygulama mantığıdır, bu nedenle açıkça modele aittir ve bu durumda bile olmasa bile, işin ortasında gerçekten kullanıcının girişine gereksinim duyduğum durumlar için çözümü bilmek isterim modelde mantık rutini.

cevap

3

Bu MVVM başlıbaşına çözmez bu sorunlardan biridir. Bir çözüm, kullanıcıyı sorgulamak için bir hizmet kullanmak ve daha sonra ViewModel'in bu servisi kullanmasıdır. Projemde

biz hizmet çerçeve sağlayarak yanında ayrıca GUI geliştirme yaparak daha kolay diğer araçlar sağlar PRISM kullanıyoruz.

Here's bir writeup nasıl PRISM hizmetler çalışır.

Özellikle sizin durumunuza göre, bir tür IOC oluşturabilir, onunla bir sorgu hizmeti kaydedebilir, ardından IOC'de ViewModel geçişinde ve sonra sorgu hizmetini almak için IOC'yi kullanabilir ve bunu sorgulamak için bunu kullanabilirim . Daha fazla iş? Emin.Ancak bu, sorgu hizmetini, yalnızca IOC'de değiştirerek sınamak için başka bir uygulama ile değiştirebileceğiniz anlamına gelir.

MVVM + Services = Ultimate Power!

+0

+1 ama bu çılgınlığı ile katılmıyorum. –

+0

Teşekkürler, bu temiz bir çözüm gibi geliyor, bağlantıları okuyacağım (teşekkürler!) –

0

Aslında, TÜM uygulama mantığında ait değil.

2 farklı "görünümünüz" var gibi görünüyor. İlk (net üzerinden gelen veriler) ve ikinci bir (onay iletişim kutusu) var.

modeli yeni görünümü görüntülenir gerektiğini belirlemek gerekiyor, bunu göstermek için görünümü, sinyal daha sonra bu görünümden girişine yanıt.

Hepsini bir adımda yapmaya çalışmayın.

+0

İlk görüşe katılıyorum - evet, ilk görünüm yalnızca servisin konsol günlüğü penceresidir ve veri girişi iletişim kutusu başka bir görünüm olarak düşünülebilir. Hovewer, model algoritma ile çalıştırılıyor ve bir alorithm'i UI tarafından eşzamansız olarak adlandırılan parçalara ayırmak zorunda kalmanın oldukça çılgın olduğunu düşünüyorum ve bazı durumlarda gerçekten mümkün değil. Ayrıca, bakım açısından bakıldığında, bir metodolojide bir algoritmaya sahip olmak çok daha iyidir. Bu nedenle, GUI'ye çağrı senkronize olmalıdır. –

+0

Tam olarak ne demek istediğini anlıyorum. Devlet makinelerini gerçekten rahatsız edici yerlerde kullanmak zorunda kaldım. Orada gitmek istemediğini bilmeme rağmen, yapmanız gereken bir şans var. Değilse, harika, ama bunu düzeltmek isteyebilirsin - muhtemelen sonunda ne yapacaksın. Bir iletişim kutusu genellikle iş parçacığı bırakmayı gerektirir. Ben bu konuda çok daha iyi açıklamak için :) –

1

bu fikir MVVM ilkeleriyle sıkı bir uygunluk içinde olup olmadığını bilmiyorum, ama ... (bir arayüz üzerinden başvurulan) bir hizmet olarak iletişim işlevleri kapsülleyen olacaktır. Hizmetin uygulanması UI katmanında olurdu, ancak test amaçlı olarak sadece arayüzü "alay" ederdiniz.