Как в приложении MAUI использовать внедрение зависимостей в AppShell
Я хотел бы использовать созданную мной службу (с интерфейсом IAuthenticationService ) внутри AppShell приложения MAUI (AppShell.xaml.cs). Другими словами, чтобы сделать что-то вроде этого:
public partial class AppShell : Shell
private readonly IAuthenticationService _AuthenticationService;
public AppShell(AuthenticationService authenticationService)
{
InitializeComponent();
_AuthenticationService = authenticationService;
}
Для вышеизложенного я добавил следующий код в файл App.xaml.cs.
public partial class App : Application
{
public App(AuthenticationService authenticationService)
{
InitializeComponent();
MainPage = new AppShell(authenticationService);
}
}
Но когда я запускаю это, я получаю ошибку:
Не удалось разрешить службу для типа «MyApp.Services.AuthenticationService» при попытке активировать «MyApp.App».
Излишне говорить, что я выполнил необходимый код в MauiProgram.cs.
builder.Services.AddSingleton<IAuthenticationService, AuthenticationService>();
Итак, как мне выполнить внедрение внедрения в App.xaml.cs или в AppShell.xaml.cs?
2 ответа
В MauiProgram.cs пропишите:
builder.Services.AddSingleton<AppShell>();
builder.Services.AddSingleton<IAuthenticationService,
AuthenticationService>();
В классе приложения:
public partial class App : Application
{
public App(AppShell appShell)
{
InitializeComponent();
MainPage = appShell;
}
}
Наконец, в классе AppShell
public partial class AppShell : Shell
{
private readonly IAuthenticationService _authenticationService;
public AppShell(IAuthenticationService authenticationService)
{
InitializeComponent();
_authenticationService = authenticationService;
}
}
Вы передаете реализацию вместо интерфейса, поэтому зависимость не может быть разрешена контейнером зависимостей.
Вместо этого ваш код должен выглядеть так:
private readonly IAuthenticationService _AuthenticationService;
//note the interface
public AppShell(IAuthenticationService authenticationService)
{
InitializeComponent();
_AuthenticationService = authenticationService;
}
и
public partial class App : Application
{
//note the interface
public App(IAuthenticationService authenticationService)
{
InitializeComponent();
MainPage = new AppShell(authenticationService);
}
}