Столкнулся с проблемой при разработке приложений с использованием 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 для моделей или интерфейсов?