MVVM + DI + IOC = а что делать с дочерними VM? - C#

Узнай цену своей работы

Формулировка задачи:

допустим есть Company, у него есть список Employee, у каждого список Addresses... есть окно, список Company, справа список Employee, а где-то-пофиг-где вложенный список Addresses делается CompanyListViewModel у которого есть список...погодите-ка, не Employee, а EmployeeViewModel потому что нужна кнопка, сортировка, фильтрация, валидация, какой-нибудь IsChecked и что угодно, короче это 100% EmployeeViewModel со своей логикой и сервисами в конструкторе иии собственно что дальше-то?
list = new AnyList<EmployeeViewModel>(rawData.Select(f=>new EmployeeViewModel(f, _repository, _logger, _dialogservice, _нужныйсервис3000)))
....и всё, сломана вся архитектура, сломан паттерн DI, нервно курит в сторонке IOC контейнер, юнит тесты уже не юнит, а хрен пойми что на всю глубину иерархии, в коде появились запретные 3 буквы new и куча возни с заполнением и инициализацией допустим сделать фабрику дочерних Viewmodel ...но какую? EmployeeViewModelFactory с одним методом...а как же IOC? как же передавать всю мишуру сервисов..тогда смысл в фабрике?
как-нибудь то мы сделали, но неужели нет какого-то шаблона и best practice? умники блоггеры никогда не уходят дальше 1 уровня иерархи в своих примерах со сраными twitter-friends, такое ощущение что ребята сроду никогда ничего боевого не писали с использованием MVVM надо всю цепочку честно делать ВМ,
КомпанияЛистВм, 
----КомпанияВм, 
--------СотрудникСписокВм, 
------------СотрудникВм, 
----------------АдресСписокВм, 
--------------------АдресВм
они все Viewmodel со своими свойствами, событиями и коммандами поверх чистого DbEntity, почти всем нужен логгер, репозиторий, диалоговые окна и другие сервисы да всё это в одном окне, нет не будет тормозить, нужны все и сразу в виде табов + списки с вложенными списками можно схлопнуть всё это в 1 viewmodel, но тогда вернется старый добрый MainForm на 5000 строк

Решение задачи: «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)
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.8 из 5
Похожие ответы