.Net MAUI - AppShell导航和依赖注入

9ceoxa92  于 2023-10-21  发布在  .NET
关注(0)|答案(3)|浏览(227)

我在玩.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
}

谢谢,菲尔

06odsfpq

06odsfpq1#

2022年1月的毛伊岛DevBlogs表明这已经实施,但由于一些问题,它似乎暂时被部分删除。现在有一个解决方案:在MauiProgram.cs的服务中添加需要DI的视图:

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

希望对Shell和DataTemplates的DI支持将很快正确实现。

xzlaal3s

xzlaal3s2#

Shell(以及关联的DataTemplates)还不支持依赖注入。存储库上的问题已打开herehere。在写这个答案的时候,一个PR是开放的,增加了这个功能。您可以跟踪该here的进度。

gwo2fgha

gwo2fgha3#

这种情况仍在发生,似乎并不是一个问题。
使用DI和HostBuilder,就像我以前每次为我的应用程序所做的那样,在Maui上不起作用。Maui有自己的应用程序构建器,所以你不仅应该添加上面提到的服务,还要确保你使用的是正确的构建器。
这里有一个代码,不会与毛伊岛工作:

var host = Host.CreateDefaultBuilder()
        .ConfigureAppConfiguration((context, builder) =>
        {
            // Add other configuration files...
            //builder.AddJsonFile("appsettings.local.json", optional: true);
        })
        .ConfigureServices((context, services) =>
        {
            ConfigureServices(context.Configuration, services);
        })
        .ConfigureLogging((_, logging) =>
        {
            logging.AddConsole();
        })
        .Build();

static void ConfigureServices(IConfiguration configuration,
        IServiceCollection services)
{
    
    // ...
    services.AddSingleton<MessageFactory>();
    services.AddSingleton<ResponseBuilder>();
    services.AddSingleton<ProtocolEventBus>();
    services.AddSingleton<NetworkSniffer>();
    services.AddSingleton<AppDelegate>();
    services.AddTransient<MainPage>();
    services.AddTransient<AppShell>();
}

}
但使用毛伊岛的建设者:

var builder = MauiApp.CreateBuilder();
    builder.Services.AddSingleton<ProtocolEventBus>();
    builder.Services.AddSingleton<MessageFactory>();
    builder.Services.AddSingleton<ResponseBuilder>();
    builder.Services.AddSingleton<NetworkSniffer>();
    builder.Services.AddSingleton<AppDelegate>();
    builder.Services.AddTransient<MainPage>();
    builder.Services.AddTransient<AppShell>();
    builder
        .UseMauiApp<App>()
        .ConfigureFonts(fonts =>
        {
            fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
            fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
        });

希望能帮上忙!
话虽如此,我真的不满意微软在OS X中处理.Net的方式:这么多的潜力,但这么多的错误,误导性的信息,仍然没有那么多的资源:/

相关问题