Как правильно организовать кросс-контекстные фичи, чтобы они укладывались в MVVM подход без дублирования кода?

Для правильной организации кросс-контекстных фич в MVVM подходе без дублирования кода, следует использовать подход с помощью паттерна "Сервисы" (Service pattern) или "Службы" (Service pattern).

Суть этого подхода заключается в том, что функциональность, которую нельзя связать с отдельной моделью представления (ViewModel), выносится в отдельный класс-сервис. Этот класс-сервис может быть общим для нескольких моделей представления или представлений, и содержит логику, которая может переиспользоваться в разных контекстах.

Ниже приведен пример реализации этого подхода:

// Пример класса-сервиса для работы с данными о пользователях
public class UserService
{
    // Метод для получения информации о пользователе по его идентификатору
    public User GetUserById(int userId)
    {
        // Логика получения информации о пользователе
        // ...

        return user;
    }
}

// Пример модели представления, которая использует сервис
public class UserDetailsViewModel : ViewModelBase
{
    private UserService _userService;
    private int _userId;

    public User User { get; private set; }

    public UserDetailsViewModel(int userId)
    {
        _userService = new UserService();
        _userId = userId;
    }

    public async Task LoadUserDetailsAsync()
    {
        User = await _userService.GetUserById(_userId);
        // Логика загрузки данных пользователя и обновления свойств модели представления
        // ...
    }
}

В приведенном примере класс UserService выступает в роли сервиса, который предоставляет доступ к данным о пользователях. Класс UserDetailsViewModel использует этот сервис для загрузки информации о пользователе по его идентификатору. Внутри метода LoadUserDetailsAsync происходит вызов соответствующего метода сервиса для получения данных пользователя. Полученные данные сохраняются в свойстве User модели представления и используются для дальнейшего отображения в пользовательском интерфейсе.

Такой подход позволяет избежать дублирования кода и обеспечивает централизованное управление кросс-контекстными фичами. Модели представления и представления могут использовать один и тот же сервис, чтобы получить доступ к общей функциональности.