Как при создании окна из сервиса окон, получить в него зависимости зарегистрированные в контейнере
Подскажите пожалуйста. Столкнулся с небольшой наверно проблемой) не пойму как в созданное окно - сервисом окон получить автоматически зависимость из контейнера (потерялась связь с контейнером наверно).
Зарегистрировал зависимости и показал окно, код:
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);
}
Но все тщетно из контейнера, туда не попадает зависимость, как же можно поступить тогда:
- Все таки руками внедрять сервис
- Прокидывать провайдер, хотя нельзя или же обращаться к классу App, где лежит контейнером, чтобы дергать, нужный сервис
- И есть еще идея, регистрировать в сервисе окон нетолько ViewModel и View, но и тут же сервис, чтобы все создавалось как надо.
- Или может я что-то упустил, и все очень просто), подскажите пожалуйста.
Реализация сервиса окон как тут
Ответы (1 шт):
При использовании 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 уже её.