将服务注入 .NET MAUI 应用程序中的视图模型
Injecting services into view models in .NET MAUI app
我正在尝试了解如何在 .NET MAUI 应用程序中实施依赖注入。
我有一个服务 class - 及其接口 - 处理我的 REST 调用,如下所示:
public class MyRestApiService : IMyRestApiService
{
public async Task<string> Get()
{
// Do someting
}
}
然后我将它放在我的 DI 容器中 MauiProgram.cs
:
builder.Service.AddTransient<IMyRestApiService, MyRestApiService>();
我还有一个视图模型,我将用于 MainPage.xaml
。问题是,如果我对我的服务进行构造函数注入,XAML 似乎不喜欢它。
MainPageViewModel
看起来像这样:
public class MainPageViewModel : BaseViewModel
{
IMyRestApiService _apiService;
public MainPageViewModel(IMyRestApiService apiService)
{
_apiService = apiService;
}
}
当我尝试将 MainPageViewModel
定义为 MainPage.xaml
的视图模型时,如下所示,出现错误:
<ContentPage.BindingContext>
<vm:MainPageViewModel />
</ContentPage.BindingContext>
错误为:
Type MainPageViewModel is not usable as an object element because it
is not public or does not define a public parameterless constructor or
a type converter.
如何将我的服务注入我的视图模型?
要将您的视图模型注入到您的视图中,您实际上需要在其构造函数中,在代码隐藏中执行此操作,如下所示:
public partial class LoginPage : ContentPage {
public LoginPage(ILoginViewModel loginViewModel) {
BindingContext = loginViewModel;
InitializeComponent();
}
}
您还必须注册使用依赖注入的视图:
builder.Service.AddTransient<LoginPage>();
Afaik 你不能像你正在做的那样在 XAML 中用 DI 实例化视图模型
您需要基本上从第一页开始解决所有问题,以便所有内容都到位并使依赖项注入起作用。
看看这个例子: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
。你可以,但是你必须自己指定参数并以某种方式从依赖注入容器中解析它们,这通常是你不想做的。
我正在尝试了解如何在 .NET MAUI 应用程序中实施依赖注入。
我有一个服务 class - 及其接口 - 处理我的 REST 调用,如下所示:
public class MyRestApiService : IMyRestApiService
{
public async Task<string> Get()
{
// Do someting
}
}
然后我将它放在我的 DI 容器中 MauiProgram.cs
:
builder.Service.AddTransient<IMyRestApiService, MyRestApiService>();
我还有一个视图模型,我将用于 MainPage.xaml
。问题是,如果我对我的服务进行构造函数注入,XAML 似乎不喜欢它。
MainPageViewModel
看起来像这样:
public class MainPageViewModel : BaseViewModel
{
IMyRestApiService _apiService;
public MainPageViewModel(IMyRestApiService apiService)
{
_apiService = apiService;
}
}
当我尝试将 MainPageViewModel
定义为 MainPage.xaml
的视图模型时,如下所示,出现错误:
<ContentPage.BindingContext>
<vm:MainPageViewModel />
</ContentPage.BindingContext>
错误为:
Type MainPageViewModel is not usable as an object element because it is not public or does not define a public parameterless constructor or a type converter.
如何将我的服务注入我的视图模型?
要将您的视图模型注入到您的视图中,您实际上需要在其构造函数中,在代码隐藏中执行此操作,如下所示:
public partial class LoginPage : ContentPage {
public LoginPage(ILoginViewModel loginViewModel) {
BindingContext = loginViewModel;
InitializeComponent();
}
}
您还必须注册使用依赖注入的视图:
builder.Service.AddTransient<LoginPage>();
Afaik 你不能像你正在做的那样在 XAML 中用 DI 实例化视图模型
您需要基本上从第一页开始解决所有问题,以便所有内容都到位并使依赖项注入起作用。
看看这个例子: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
。你可以,但是你必须自己指定参数并以某种方式从依赖注入容器中解析它们,这通常是你不想做的。