.Net MAUI — навигация по оболочке приложения и внедрение зависимостей

#c# #.net #dependency-injection #maui

#c# #.net #внедрение зависимостей #maui

Вопрос:

Я играю с этим.Чистый Maui, AppShell и внедрение зависимостей.

Я пытаюсь вызвать страницу с конструктором, который принимает ViewModel этой страницы в качестве параметра.

Конструктор выглядит следующим образом:

 public AuthenticationPage(AuthenticationViewModel viewModel)
{
    InitializeComponent();
    BindingContext = viewModel;
}
 

В моем MauiProgram.cs я зарегистрировал как страницу, так и виртуальную машину

 builder.Services.AddSingleton<AuthenticationViewModel>();
builder.Services.AddSingleton<AuthenticationPage>();
 

Мой App.xaml.cs выглядит так:

 public partial class App : Application
{
    public App()
    {
        InitializeComponent();
        MainPage = new AppShell();
    }
}
 

И мой AppShell.xaml выглядит так:

 <Shell  xmlns="http://schemas.microsoft.com/dotnet/2021/maui" 
           xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
           xmlns:pages="clr-namespace:DeepBlue.Pages"
           xmlns:auth="clr-namespace:DeepBlue.Pages.Authentication"
           x:Class="DeepBlue.AppShell">

    <!-- Login and Registration Page -->
    <ShellContent Route="login"
                  ContentTemplate="{DataTemplate auth:AuthenticationPage}">
    </ShellContent>

    <!-- Main Page -->
    <FlyoutItem Route="main"
                FlyoutDisplayOptions="AsMultipleItems">
        <ShellContent Route="dashboard"
                      ContentTemplate="{DataTemplate pages:DashboardPage}"
                      Title="Home" />
    </FlyoutItem>

</Shell>
 

Теперь, когда я выполняю свой проект, я получаю следующую ошибку:

Исключение System.missingmethod: «Для типа DeepBlue не определен конструктор без параметров «.Страницы.Аутентификация.Страница аутентификации ‘.’

Может кто-нибудь, пожалуйста, скажите мне, почему внедрение зависимостей не работает в этом случае?

Если я не реализую оболочку приложения, все работает нормально…. Я могу вызвать AuthenticationPage как главную страницу с помощью инъекции из моего App.xaml.cs следующим образом:

 public App(AuthenticationPage page)
{
    InitializeComponent();
    MainPage = page
}
 

Спасибо, Фил

Ответ №1:

Оболочка (и связанные с ней DataTemplates) не поддерживает внедрение зависимостей (пока). Проблемы в репозитории открываются здесь и здесь . И на момент написания этого ответа открыт PR, который добавляет эту функциональность. Вы можете отслеживать прогресс в этом здесь.

Ответ №2:

В блогах разработчиков Maui за январь 2022 года предполагалось, что это было реализовано, но, похоже, оно частично удалено временно из-за некоторых проблем. На данный момент есть обходной путь: добавьте представление, для которого требуется DI, в сервисы в MauiProgram.cs:

 // Workaround for Shell/DataTemplates:
builder.Services.AddTransient<MainPage>();
builder.Services.AddTransient<AuthenticationPage>();
 

Надеюсь, поддержка DI для Shell и DataTemplates скоро будет реализована правильно.