繁体   English   中英

在 .NET MAUI 应用程序中将服务注入视图模型

[英]Injecting services into view models in .NET MAUI app

我试图了解如何在 .NET MAUI 应用程序中实现依赖注入。

我有一个服务类 - 及其接口 - 处理我的 REST 调用,如下所示:

public class MyRestApiService : IMyRestApiService
{
   public async Task<string> Get()
   {
      // Do someting
   }
}

然后我将它放在MauiProgram.cs的 DI 容器中:

builder.Service.AddTransient<IMyRestApiService, MyRestApiService>();

我还有一个将用于MainPage.xaml的视图模型。 问题是,如果我对我的服务进行构造函数注入,XAML 似乎不喜欢它。

MainPageViewModel如下所示:

public class MainPageViewModel : BaseViewModel
{
   IMyRestApiService _apiService;
   public MainPageViewModel(IMyRestApiService apiService)
   {
      _apiService = apiService;
   }
}

当我尝试将MainPage.xaml定义为MainPageViewModel的视图模型时,如下所示,出现错误:

<ContentPage.BindingContext>
   <vm:MainPageViewModel />
</ContentPage.BindingContext>

错误内容如下:

类型 MainPageViewModel 不能用作对象元素,因为它不是公共的或未定义公共无参数构造函数或类型转换器。

如何将我的服务注入到我的视图模型中?

您将希望基本上从第一页解决所有问题,以使所有内容都到位并进行依赖注入。

看看这个例子: https ://github.com/jfversluis/MauiDependencyInjectionSample

您将需要注册您的服务、视图模型和视图。 在您的情况下,在您的MauiProgram.cs添加:

// Change scopes as needed, this seems to make sense
builder.Service.AddTransient<MainPage>();
builder.Service.AddTransient<MainPageViewModel>();
builder.Service.AddSingleton<IMyRestApiService, MyRestApiService>();

然后在您的App.xaml.cs中也开始注入您的(主)页面:

public partial class App : Application
{
    public App(MainPage page)
    {
        InitializeComponent();

        MainPage = page;
    }
}

现在在您的MainPage.xaml.cs添加一个构造函数,如下所示:

public LoginPage(MainPageViewModel viewModel)
{
    InitializeComponent();

    BindingContext = viewModel;
}

从那里一切都应该效仿并连接起来。 你想做什么

<ContentPage.BindingContext>
   <vm:MainPageViewModel />
</ContentPage.BindingContext>

基本上是通过属性设置BindingContext 你可以,但是你必须自己指定参数并以某种方式从依赖注入容器中解析它们,这通常是你不想做的。

要将您的视图模型注入到您的视图中,您实际上需要在其构造函数中执行它,在后面的代码中,如下所示:

public partial class LoginPage : ContentPage {
    public LoginPage(ILoginViewModel loginViewModel) {
        BindingContext = loginViewModel;
        InitializeComponent();
    }
}

您还必须注册使用依赖注入的视图:

builder.Service.AddTransient<LoginPage>();

Afaik 你不能像你正在做的那样在 XAML 中使用 DI 实例化视图模型

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2025 STACKOOM.COM