我在玩.Net Maui,AppShell和依赖注入。
我尝试调用一个带有构造函数的页面,该构造函数将该页面的ViewModel作为参数。
构造函数看起来像这样:
public AuthenticationPage(AuthenticationViewModel viewModel)
{
InitializeComponent();
BindingContext = viewModel;
}
在我的MauiProgram.cs中,我注册了页面和VM
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.MissingMethodException:'没有为类型'DeepBlue.Pages.Authentication. AuthenticationPage '定义无参数构造函数。'
有人能告诉我为什么依赖注入在这种情况下不起作用吗?
如果我不实现AppShell,一切都很好。我可以通过从App.xaml.cs注入来调用AuthenticationPage作为MainPage,如下所示:
public App(AuthenticationPage page)
{
InitializeComponent();
MainPage = page
}
谢谢,菲尔
3条答案
按热度按时间06odsfpq1#
2022年1月的毛伊岛DevBlogs表明这已经实施,但由于一些问题,它似乎暂时被部分删除。现在有一个解决方案:在MauiProgram.cs的服务中添加需要DI的视图:
希望对Shell和DataTemplates的DI支持将很快正确实现。
xzlaal3s2#
Shell(以及关联的DataTemplates)还不支持依赖注入。存储库上的问题已打开here和here。在写这个答案的时候,一个PR是开放的,增加了这个功能。您可以跟踪该here的进度。
gwo2fgha3#
这种情况仍在发生,似乎并不是一个问题。
使用DI和HostBuilder,就像我以前每次为我的应用程序所做的那样,在Maui上不起作用。Maui有自己的应用程序构建器,所以你不仅应该添加上面提到的服务,还要确保你使用的是正确的构建器。
这里有一个代码,不会与毛伊岛工作:
}
但使用毛伊岛的建设者:
希望能帮上忙!
话虽如此,我真的不满意微软在OS X中处理.Net的方式:这么多的潜力,但这么多的错误,误导性的信息,仍然没有那么多的资源:/