Лишние модели для ВМ - PullRequest
       18

Лишние модели для ВМ

0 голосов
/ 07 ноября 2018

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

Модель - это отдельный компонент (предположим, компания).

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);
    }
}

Внутри этой модели есть много объектов, которые она включает. По аналогии с компанией они могут быть представлены как сотрудники менеджера, директора, тестировщика и все они унаследованы от класса 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;}
}
...

Для редактирования каждого типа работников предусмотрена его собственная презентация и собственная виртуальная машина.

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())
    }
}

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

1 Ответ

0 голосов
/ 07 ноября 2018

Одна хитрость, которая приходит мне в голову, - это создать одну View + ViewModel, которая поможет вам редактировать и сохранять изменения в словаре. Затем добавьте методы ко всем вашим моделям, чтобы помочь преобразовать ToDictionary () и загрузить FromDictionary ().

Таким образом, для редактирования любой модели она сначала будет преобразована в словарь (ключ - это свойство Name, а значение - значение, которое нужно редактировать). Тогда ваш вид поможет вам редактировать значения (** сложно сделать тип данных и проверки бизнеса сейчас **). Затем по команде сохранения все, что вам нужно сделать, это обновить объект обратно из словаря.

Obervation: Модель не должна иметь ObservableCollection.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...