Проектирование информационной системы для Windows Store. Обработка данных
Использование паттерна MVVM
Модель связывания данных в WinRT позволяет использовать паттерн MVVM для архитектуры приложения. Данный паттерн был представлен Джоном Госсманом в 2005 году. Он представляет модификацию паттерна MVP и ориентирован на современные платформы разработки, которые имеют возможность связывания данных.
Благодаря применению этого паттерна у разработчика появляется возможность разделения представления и модели, тем самым изменения их независимо друг от друга. Например, разработчики создают логику работы приложения, а дизайнеры работают над интерфейсом приложения.
Данный паттерн следует применять, если в технологии присутствует механизм связывания данных. Использование паттерна MVC/MVP в таких случаях не вкладывается в их концепцию.
Паттерн MVVM делится на три части (Рис. 8.3):
- Model - представляет фундаментальные данные, необходимые для работы приложения;
- View - это графический интерфейс нашего приложения;
- ViewModel - является с одной стороны абстракцией View, а с другой - предоставляет обертку данных из Model, которые подлежат связыванию. То есть она содержит Model, которая преобразована к View, а так же содержит команды, которыми может пользоваться View, чтобы влиять на Model.
Классическая реализация базовой ViewModel:
public class ViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChanged(string propertyName)
{
var handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}Далее, разделение логики на модели ViewModel происходит отдельно для каждого проекта. Все последующие ViewModel являются наследниками базовой.
Например, возьмем тип данных Employee и реализуем для него ViewModel
public class EmployeeViewModel : ViewModel
{
public ObservableCollection<Employee>
EmployeeCollection { get; private set; }
public ICommand AddEmployee { get; private set; }
public ICommand EditEmployee { get; private set; }
public ICommand DeleteEmplyee { get; private set; }
public EmployeeViewModel()
{
EmployeeCollection = new ObservableCollection<Employee>
{
new Employee { FirstName="Sergii", LastName="Lutai",
Age=27, EMail="sergii.lutai@dct.ua"},
new Employee { FirstName="Sergiy", LastName="Baydachnyy",
Age=32, EMail="Sergiy.Baydachnyy@microsoft.com"},
new Employee { FirstName="Ivan", LastName="Ivanov",
Age=29, EMail="ivan@ivanov.ua"}
};
AddEmployee = new RelayCommand<Employee>
(this.AddEmployeeExecute, this.AddEmployeeCanExecute);
}
private void AddEmployeeExecute(Employee employee)
{
//TODO: Логика добавления объекта
}
private bool AddEmployeeCanExecute(Employee employee)
{
//TODO: Логика проверки возможности добавления нового объекта
return employee != null;
}
}В данном примере класс RelayCommand является одной из возможных реализаций интерфейса System.Windows.Input.RelayCommand:
public class RelayCommand<T>: ICommand
{
private Action<T> action;
private Func<T, bool> func;
public RelayCommand(Action<T> action)
{
this.action = action;
}
public RelayCommand(Action<T> action, Func<T, bool> func)
{
this.action = action;
this.func = func;
}
public bool CanExecute(object parameter)
{
bool result = true;
T value = default(T);
if (parameter != null && !(parameter is T))
{
throw new ArgumentException("Wrong parameter type.",
"parameter");
}
if (parameter != null)
{
value = (T)parameter;
}
if (func != null)
{
result = func(value);
}
return result;
}
public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
T value = default(T);
if (parameter != null && !(parameter is T))
{
throw new ArgumentException("Wrong parameter type.",
"parameter");
}
if (parameter != null)
{
value = (T)parameter;
}
var canExecute = CanExecute(value);
if (canExecute)
{
action(value);
}
}
public void RaiseCanExecuteChanged()
{
var handler = CanExecuteChanged;
if (handler != null)
{
handler(this, EventArgs.Empty);
}
}
}Для проверки нашей логики будем использовать следующее представление:
<Page
x:Class="MVVM.Sample.BlankPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:MVVM.Sample"
xmlns:viewModel="using:ViewModel">
<Page.Resources>
<viewModel:EmployeeViewModel x:Key="EmployeeViewModel"/>
</Page.Resources>
<Page.DataContext>
<Binding Source="{StaticResource EmployeeViewModel}"/>
</Page.DataContext>
<Grid Background="{StaticResource ApplicationPageBackgroundBrush}">
<Button Content="Add New Employee" VerticalAlignment="Top"
Command="{Binding AddEmployee, Mode=OneTime,
Source={StaticResource EmployeeViewModel}}"/>
<ListBox ItemsSource="{Binding EmployeeCollection}"
Margin="0,40,0,0">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Button Content="Delete"
Command="{Binding DeleteEmplyee, Mode=OneWay,
Source={StaticResource EmployeeViewModel}}"
CommandParameter="{Binding Mode=OneWay}"/>
<Button Content="Edit"
Command="{Binding EditEmployee, Mode=OneWay,
Source={StaticResource EmployeeViewModel}}"
CommandParameter="{Binding Mode=OneWay}"/>
<TextBlock Text="{Binding FirstName}"
Margin="40,0,40,0"/>
<TextBlock Text="{Binding LastName}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</Page>Во время работы наш пример имеет следующий вид:
Таким образом, используя паттерн MVVM, можно разделить работу дизайнеров и разработчиков. Что в свою очередь позволяет сосредоточиться именно на логике бизнес-процессов внутри приложения. При этом возможность тестирования бизнес-логики приложения увеличивается в разы.
Краткие итоги
Рассмотрены основные подходы к проектированию информационных систем. Отмечены основные отличия информационных систем от локальных программных продуктов.
Вопросы
- Какие ключевые вопросы необходимо решить при оценке проектов?
- Что включает информационная архитектура?
- Стадии и этапы создания информационных систем и технологий с позиции руководства организации.
- Что собой представляет жизненный цикл информационных систем?
- Каковы стадии жизненного цикла информационных систем?
- Этапы предпроектного обследования информационных систем.
- Какие этапы включает проектирование информационных систем?
- Какие этапы включает стадия разработки информационных систем?
- Какие этапы включает стадия ввода информационных систем в эксплуатацию?
- Какие этапы включает стадия эксплуатации информационных систем?
- Каковы особенности проектирования информационных систем?

