Как в приложении 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);
    }
}
Другие вопросы по тегам