Как при создании окна из сервиса окон, получить в него зависимости зарегистрированные в контейнере

Подскажите пожалуйста. Столкнулся с небольшой наверно проблемой) не пойму как в созданное окно - сервисом окон получить автоматически зависимость из контейнера (потерялась связь с контейнером наверно).

Зарегистрировал зависимости и показал окно, код:

public partial class App : Application
 {
     IServiceCollection _services;
     IServiceProvider _serviceProvider;

     protected override void OnStartup(StartupEventArgs e)
     {
         base.OnStartup(e);

         _services = new ServiceCollection();
         ConfigureServices(_services);
         
         _serviceProvider = _services.BuildServiceProvider();
         
         var loginWindow = _serviceProvider.GetService<LoginWindow>();
         loginWindow.Show();
     }

     void ConfigureServices(IServiceCollection services)
     {
         services.AddTransient<LoginWindow>(); 
         services.AddTransient<LoginViewModel>();

         services.AddScoped<IWindowService, WindowService>();

         services.AddScoped<ILoginService, LoginService>();
     }
 }

Далее в VM открытого окна прокидывается из контейнера сервис окон. В этой VM регистрирую в сервисе окон типы и показываю окно, код:

public class LoginViewModel : ViewModel
{
    public string Identifier { get; set; } = string.Empty;

    public ICommand OpenSettingBDCommand { get; set; }

    IWindowService _windowService;
    public LoginViewModel(IWindowService windowService)
    {
        _windowService = windowService;

        Register();

        OpenSettingBDCommand = new Command(_ => { OpenSettingBD(); });
    }

    void Register() => _windowService.RegisterViewType<SettingBDViewModel, SettingBDWindow>();
    void OpenSettingBD()
    {
        SettingBDViewModel viewModel = new();
        _windowService.ShowModalView(viewModel);
    }

Здесь и началась проблемка, для созданного окно SettingBDWindow, SettingBDViewModel принимает еще один сервис, для проверки получения сервиса сделал так, код:

public class SettingBDViewModel : ViewModel
 {
     public string Text { get; set; } = string.Empty;

     public SettingBDViewModel(ILoginService loginService)
     {
         Text = loginService.ToString();
     }
 }

В методе ниже инструкция конструктора требует сервис, которые ему нужен, но нужно же получать автоматически из контейнера., подумал я и сделал в конструкторе для аргумента конструктора = null, чтобы не сувать руками - new LoginService() в SettingBDViewModel viewModel = new();

void OpenSettingBD()
{
    SettingBDViewModel viewModel = new();
    _windowService.ShowModalView(viewModel);
}

Но все тщетно из контейнера, туда не попадает зависимость, как же можно поступить тогда:

  1. Все таки руками внедрять сервис
  2. Прокидывать провайдер, хотя нельзя или же обращаться к классу App, где лежит контейнером, чтобы дергать, нужный сервис
  3. И есть еще идея, регистрировать в сервисе окон нетолько ViewModel и View, но и тут же сервис, чтобы все создавалось как надо.
  4. Или может я что-то упустил, и все очень просто), подскажите пожалуйста.

Реализация сервиса окон как тут


Ответы (1 шт):

Автор решения: KLGR

При использовании di все получайте через IServiceCollection. Я не знаю, где у вас OpenSettingBD() (будем считать, что в неком MainViewModel), передавайте в этот класс инстанс SettingBDViewModel тоже через di, не используйте new(). То есть там будет код типа такого:

class MainViewModel
{
   private readonly SettingsBDViewModel _sBDVM;
   
   public MainViewModel(SettingsBDViewModel vm)
   {
      _sBDVM = vm;
   }

   void OpenSettingsBD()
   {
      _windowService.ShowModalView(_sBDVM);
   }
}

Либо делайте фабрику для VM диалоговых окошек и внедряйте через di уже её.

→ Ссылка