Мне интересно, как добиться чистой архитектуры в моем решении. У меня есть проекты: Core (Модели, Сообщения, ViewModels), Mobile (проект Maui -> Представления), Shared (проект Dto). У меня есть:
<PanGestureRecognizer PanUpdated = "PanGestureRecognizer_PanUpdated"/>
в моем представлении, которое я передаю MyViewModel через:
private void PanGestureRecognizer_PanUpdated(object sender, PanUpdatedEventArgs e)
{
var panUpdatedCommand = ((MyViewModel)BindingContext).PanUpdatedCommand;
panUpdatedCommand.Execute(e);
}
Здесь я передаю EventArgs: PanUpdatedEventArgs, который зависит от Мауи.
Тогда я не могу использовать RelayCommand в MyViewModel вот так:
[RelayCommand]
private void PanUpdated(PanUpdatedEventArgs e)
{
switch (e.StatusType)
{
case GestureStatus.Started:
...
case GestureStatus.Running:
...
case GestureStatus.Canceled:
...
case GestureStatus.Completed:
...
}
}
потому что PanUpdatedEventArgs и GestureStatus взяты из библиотеки Мауи, но мой MyViewModel должен быть независимым из-за чистой архитектуры. Как я могу этого добиться? Или мне следует поместить папку ViewModel на уровень Mobile?
Использование EventArgs представления непосредственно в ViewModel не является ни MVVM, ни чистой архитектурой, поскольку это создает жесткую зависимость между ViewModel и View. Ваши ViewModel также относятся к мобильному уровню, но даже в этом случае ViewModel не должна знать о представлении. Однако зачем вам нужна чистая архитектура для мобильного приложения? Это звучит слишком сложно. Я бы рекомендовал использовать модульный монолит или вертикальные срезы.
Думаю, я упустил концепцию чистой архитектуры и пытаюсь создать модульное приложение на основе: github.com/PacktPublishing/MVVM-pattern-.NET-MAUI/tree/main/…
Полезное правило: если вы используете какой-либо тип пользовательского интерфейса в своей ViewModel и ниже, вы сделали что-то не так в отношении MVVM.





Вы добавляете CommunityToolkit MAUI и используете EventToCommandBehavior.
https://learn.microsoft.com/en-us/dotnet/communitytoolkit/maui/behaviors/event-to-command-behavior
Две важные вещи:
EventArgsConverter для преобразования EventArgs в другой тип, который передается команде.Вот как я вообще использую события.
(Далее мое мнение) Я серьезно сомневаюсь, что это мероприятие имеет какие-либо основания превращаться в командные. Это похоже на механический код, который если где-то и принадлежит самому View.
Я не до конца понял вашу цель, однако вы могли бы подумать о том, что базовый класс
Multiple Inheritanceнаследуется отObservableObjectиInterfaces