2015-02-24 2 views
3

Я прочитал обсуждения об открытии диалога с использованием шаблона mvvm. Я видел несколько примеров, которые говорят, чтобы использовать сервис, но я не понимаю, как все части подходят друг к другу. Я отправляю этот вопрос с просьбой дать указания в том, что я должен прочитать, чтобы лучше понять, чего мне не хватает. Я опубликую то, что у меня внизу, и это работает, но из того, что я вижу в этих сообщениях, я не делаю это правильно или, возможно, не делаю это эффективно. Я вижу, где создается диалоговый интерфейс, а затем класс, который использует интерфейс для выполнения фактической работы. Затем в ViewModel конструктор проходит в этом интерфейсе, это часть, которая меня действительно смущает, не уверен, что ее передают, не хватает информации для подключения точек и не уверен, чего я не вижу.Попытка понять использование службы для открытия диалога

Вот одно сообщение, на которое я смотрел: https://stackoverflow.com/a/1044304/4593652 Я как бы вижу, что они предлагают, но для кого-то не хватает информации. Я не прошу кого-нибудь написать это для меня, просто надеясь на какой-то совет о том, что я должен прочитать, чтобы понять, как эти части подходят друг другу.

В моем коде у меня есть класс, как это: (Это работает, я просто чувствую, что я что-то из того, что я читал на других постах отсутствует)

public class OpenDialogService 
    { 
    public string GetOpenDialog(string title) 
    { 
     CommonOpenFileDialog dlg = new CommonOpenFileDialog(); 
     dlg.Title = title; 
     dlg.IsFolderPicker = true; 
     dlg.AddToMostRecentlyUsedList = true; 
     dlg.AllowNonFileSystemItems = false; 
     dlg.EnsureFileExists = false; 
     dlg.EnsurePathExists = true; 
     dlg.EnsureReadOnly = false; 
     dlg.EnsureValidNames = true; 
     dlg.Multiselect = false; 
     dlg.ShowPlacesList = true; 

     if (dlg.ShowDialog() == CommonFileDialogResult.Ok) 
     { 
      return dlg.FileName; 
     } 
     return null; 
    } 
} 

Затем я использую это в моем ViewModel, когда вызывается моя команда.

path = new OpenDialogService().GetOpenDialog("..."); 
+1

Ответы будут все любезны. Если это сработает для вас, придерживайтесь его, пока не найдете лучший способ. Это часть учебного процесса. В программировании нет единого «правильного пути». – walther

+0

@walther Я не уверен в этом. Хотя нет единого способа правильно программировать, есть шаблоны, которые, если вы не реализуете правильно, уже не являются таким шаблоном, это что-то еще.В этом случае он неправильно реализовал шаблон сервиса. –

ответ

3

Walther в основном прав.

В другом сообщении говорится, что он может изменить свою реализацию обслуживания через контейнер IOC. IOC означает «Инверсия управления» -Патерн, вы можете прочитать статью this, чтобы получить базовый обзор. Я думаю, что «Сервис» приходит также из этого шаблона. Другим модным словом является инъекция зависимостей, которую вы можете искать.

+0

Спасибо ec8or. Я читал о МОК и смотрел некоторые учения об этом. Все еще есть способы пойти, но у меня теперь намного лучше справиться с этим и понять, как сочетать фигуры намного лучше, чем раньше. – gwm

2

Хорошо, здесь есть пара проблем.

Как отметил @ ec8or, вы должны прочитать «Инверсия управления» (IoC), так как почти все рамки MVVM используют его. Шаблон обслуживания также зависит от IoC, так что тестирование проще.

Биты, отсутствующие в вашем коде, являются интерфейсом для службы и используют IoC для ввода этого кода в ваши ViewModels.

public interface IOpenDialogService 
{ 
    string GetOpenDialog(string title); 
} 

public class OpenDialogService : IOpenDialogService ... 

И затем использовать его в ViewModel

public class MyViewModel 
{ 
    private IOpenDialogService openDialogService; 

    // service injected by the IoC 
    public MyViewModel(IOpenDialogService openDialogService) 
    { 
     this.openDialogService = openDialogService; 
    } 

    public void DoCommand() 
    { 
     var path = openDialogService.GetOpenDialog("..."); 
    } 
} 

Так почему же это?

При проверке ViewModel вы не хотите, чтобы открытые диалоги внезапно всплывали, что приводило к сбою теста или зависанию. Поэтому во время тестирования мы можем изменить реализацию IOpenDialogService на то, что возвращает константу, например. Затем, когда вы проверяете ViewModel вместо открытия диалога, код просто получает константу и продолжает работать, позволяя завершить тест.

Таким образом, вам не нужно изменять код ViewModel, чтобы заставить его работать во время тестирования.

+0

Спасибо, это помогло мне лучше понять, как части подходят друг к другу в отношении тестирования моего кода. Я ценю руководство. – gwm

+0

Я установил свой datacontext в своем главном представлении следующим образом: я бы все же обработал это в моем xaml теперь, когда мой конструктор viewmodel принимает аргументы или лучше позаботиться об этом в коде? gwm

Смежные вопросы