MVVM + DI + IOC = а что делать с дочерними VM? - C#
Формулировка задачи:
допустим есть Company, у него есть список Employee, у каждого список Addresses...
есть окно, список Company, справа список Employee, а где-то-пофиг-где вложенный список Addresses
делается CompanyListViewModel у которого есть список...погодите-ка, не Employee, а EmployeeViewModel
потому что нужна кнопка, сортировка, фильтрация, валидация, какой-нибудь IsChecked и что угодно, короче это 100% EmployeeViewModel со своей логикой и сервисами в конструкторе
иии собственно что дальше-то?
....и всё, сломана вся архитектура, сломан паттерн DI, нервно курит в сторонке IOC контейнер, юнит тесты уже не юнит, а хрен пойми что на всю глубину иерархии, в коде появились запретные 3 буквы new и куча возни с заполнением и инициализацией
допустим сделать фабрику дочерних Viewmodel ...но какую? EmployeeViewModelFactory с одним методом...а как же IOC? как же передавать всю мишуру сервисов..тогда смысл в фабрике?
они все Viewmodel со своими свойствами, событиями и коммандами поверх чистого DbEntity, почти всем нужен логгер, репозиторий, диалоговые окна и другие сервисы
да всё это в одном окне, нет не будет тормозить, нужны все и сразу в виде табов + списки с вложенными списками
можно схлопнуть всё это в 1 viewmodel, но тогда вернется старый добрый MainForm на 5000 строк
list = new AnyList<EmployeeViewModel>(rawData.Select(f=>new EmployeeViewModel(f, _repository, _logger, _dialogservice, _нужныйсервис3000)))
как-нибудь то мы сделали, но неужели нет какого-то шаблона и best practice?
умники блоггеры никогда не уходят дальше 1 уровня иерархи в своих примерах со сраными twitter-friends, такое ощущение что ребята сроду никогда ничего боевого не писали с использованием MVVM
надо всю цепочку честно делать ВМ,
КомпанияЛистВм, ----КомпанияВм, --------СотрудникСписокВм, ------------СотрудникВм, ----------------АдресСписокВм, --------------------АдресВм
Решение задачи: «MVVM + DI + IOC = а что делать с дочерними VM?»
textual
Листинг программы
public interface IAdressViewModelFactory { IAdressViewModell Create(Adress adress, object anyParameter) } public class AdressViewModelFactory : IAdressViewModelFactory { private ISomeServiceForAdress _someServiceForAdress; public AdressViewModelFactory(ISomeServiceForAdress someServiceForAdress) { _someServiceForAdress = someServiceForAdress; } public IAdressViewModell Create(Adress adress, ISomeServiceForAdress someServiceForAdress, object anyParameter) { return new AdressViewModell(adress, someServiceForAdress, anyParameter) } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д