#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 скоро будет реализована правильно.