Множество VM для схожих моделей

135
04 апреля 2019, 04:00

Столкнулся с проблемой при проектировании приложения, используя WPF и паттерн MVVM.

Модель представляет из себя один компонент (Допустим, Company)

class Company
{
    private string _Name;
    public ObservableCollection<Manager> Managers {get; set;}
    public ObservableCollection<Director> Directors {get; set;}
    public ObservableCollection<Tester> Testers {get; set;}
}

Для этой модели есть свой VM и View. Детали вроде InotifyPropertyChanged я опущу, будем считать, они реализованы в базовом классе ViewModel, объекты Command и Mediator соответствуют реализации классических паттернов

class CompanyViewModel: ViewModel
{
   private Company _Company;
   public ICommand AddManagerCommand { get; }
   public ICommand AddTesterCommand { get; }
   public ICommand AddDirectorCommand { get; }
   public CompanyViewModel()
   {
      _Company = new Company();
      AddManagerCommand = new Command(OnAddManagerExecuted);
      AddTesterCommand = new Command(OnAddTesterExecuted);
      AddDirectorCommand = new Command(OnAddDirectorExecuted);
      Mediator.Register("GetManager", OnGetManager);
      ...
     ...
   }
    private void OnGetManager(object obj)
    {
        _Company.Managers.Add((Employee)obj);
    }
}

внутри этой модели, есть множество объектов, которые она в себя включает. По аналогии с компанией их можно представить как работников Manager, Director, Tester и все они наследуются от класс Employee.

class Employee
{
    public string Name {get; set;}
}
class Manager : Employee
{
    public string Age {get; set;}
    public string Sex {get; set;}
}
class Director : Employee
{
    public string Age {get; set;}
    public string Education {get; set;}
}
...

Для редактирования каждого типа работников, предусмотренно свое представление и своя VM.

class ManagerViewModel : ViewModel
{
    public Command SaveCommand {get; private set;}
    public ManagerViewModel()
    {
        SaveCommand = new Command(OnSaveCommandExecuted)
    }
    private void OnSaveCommandExecuted(object window)
    {
        Mediator.NotifyColleggues("GetManager", new Manager())
    }
}

В результате, с таким подходом, я имею множество VM и view для каждого типа сотрудников и для каждого из них своя ObservableCollection в модели Company.

Таким образом, при добавлении нового типа сотрудников я вынужден унаследовать от Employee новый класс, создать новую VM, новый View, зарегистрировать в Mediator новое сообщение, чтобы оповестить VM Сompany о добавлении нового элемента в ObservableCollection из View нового типа сотрудника и добавить новую Command в VM Company для вызова Окна редактирования сотрудника. Эта архитектура кажется мне ужасно регидной и я хотел бы узнать, какое решение может помочь мне увеличить масштабируемость системы, возможно какое-то специфическое использование Фасада для моделей или Интерфейсов?

READ ALSO
Передача значения переменной в классе

Передача значения переменной в классе

Есть приложение Windows Form с несколькими формамиЕсть код класса:

145
Adapter.Update(DataTable dt) не обновляет все записи

Adapter.Update(DataTable dt) не обновляет все записи

Данные из таблицы базы данных отображаются в treeList1(DevExpress) и дублируются в dataGridViewПользователь изменяет данные в treeList1 (изменения происходят...

204
Выбор значений С По из запроса SQLITE

Выбор значений С По из запроса SQLITE

К примеру у меня есть запрос:

123
Запись в масив масивов

Запись в масив масивов

Есть массив массивов, создан таким образом

111