Como chegar limpa a entrada do usuário a partir do meio do método de modelo na arquitetura Model-View-ViewModel?

votos
6

Estou escrevendo um aplicativo que escuta em uma conexão de rede, e quando alguns dados chegam, ele responde de volta, e dependendo dos dados de entrada, ele pode precisar pedir usuário (diálogo show) antes de responder de volta.

Eu não sei como fazer isso de forma limpa na arquitetura MV-VM: os eventos e ligação a coleções observáveis ​​são agradáveis ​​se eu precisar apenas atualizar GUI com base em dados de entrada, mas o que se eu realmente preciso de uma anwer do usuário antes de responder de volta ?

E para piorar as coisas, eu quero fazê-lo de forma síncrona, porque eu quero que meu algoritmo resposta para estar em um lugar, não particionado em vários retornos de chamada com pouco claras que-chama-Quem responsabilidades.

Simplesmente, algo como

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

mas eu não quero chamar vista ou viewmodel do modelo, como modelo precisa ser reutilizável e testável - Eu não quero avançar diálogos em cada teste, e seria violação de MVVM! Nenhum evento (eles são apenas one-way, tanto quanto eu sei, e não têm para trás canalizar para obter resposta a origem do evento) ou ligação de dados, como seria assíncrona.

É este factível? Esta é uma pergunta que eu fiz várias propagadores test driven development, e até agora, eu não recebi resposta praticamente utilizável. No entanto, a necessidade de alguma entrada adicional no meio do processamento é bastante comum.

Obrigado!

EDIT: esta é a lógica da aplicação, de modo que claramente pertence a modelar, e mesmo se, neste caso, não, eu gostaria de saber a solução para os casos em que eu realmente preciso de entrada do usuário no meio da rotina de lógica de negócios no modelo .

Publicado 19/05/2009 em 21:22
fonte usuário
Em outras línguas...                            


3 respostas

votos
3

Este é um daqueles problemas que MVVM não resolve por si própria. Uma solução seria a utilização de um serviço para consultar o usuário e, em seguida, ter o ViewModel usar esse serviço.

No meu projeto estamos usando PRISM , que além de proporcionar uma estrutura de serviços também oferece outras ferramentas para tornar o desenvolvimento GUI mais fácil.

Aqui está um writeup de como os serviços trabalham em PRISM.

Então, especificamente no seu caso eu iria criar algum tipo de IOC, cadastre-se um serviço de consulta com ele, em seguida, no ViewModel passar o COI e, em seguida, usar o COI para obter o serviço de consulta, e usar isso para consultar o usuário. Mais trabalho? Certo. Mas isso significa que você pode substituir o serviço de consulta com outra implementação para o teste, basta substituí-lo no COI.

MVVM + Serviços = Ultimate Power!

Respondeu 20/05/2009 em 00:48
fonte usuário

votos
1

Eu não sei se essa idéia está em estrita conformidade com os princípios de MVVM, mas ... Gostaria de encapsular a funcionalidade de diálogo como um serviço (referenciada através de uma interface). A implementação do serviço seria na camada de interface do usuário, mas para fins de teste você faria apenas "falsa" a interface.

Respondeu 19/05/2009 em 23:34
fonte usuário

votos
0

Na verdade, não pertencem na lógica da aplicação.

Parece que você tem 2 "vistas" diferentes. Existe a um inicial (vindo dados em cima da rede), e um segundo (diálogo de confirmação).

O modelo precisa determinar que um novo modo de exibição precisa ser exibido, sinalizar o fim de exibi-lo, em seguida, responder mais tarde para a entrada do que vista.

Não tente fazer tudo em uma única etapa.

Respondeu 19/05/2009 em 21:51
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more