Столкнулся с проблемой при проектировании приложения, используя 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 для вызова Окна редактирования сотрудника. Эта архитектура кажется мне ужасно регидной и я хотел бы узнать, какое решение может помочь мне увеличить масштабируемость системы, возможно какое-то специфическое использование Фасада для моделей или Интерфейсов?
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Есть приложение Windows Form с несколькими формамиЕсть код класса:
Данные из таблицы базы данных отображаются в treeList1(DevExpress) и дублируются в dataGridViewПользователь изменяет данные в treeList1 (изменения происходят...