У меня есть сервисная коллекция, подобная следующей
ServiceProvider serviceProvider = new ServiceCollection()
.AddSingleton(service1)
.AddSingleton(service2)
.AddTransient<MyViewModel1>()
.AddTransient<MyViewModel2>()
.AddTransient<MyViewModel3>()
.BuildServiceProvider();
MyViewModel1
имеет конструктор, требующий его зависимостей, а затем ожидаемое волшебство происходит, когда я вызываю serviceProvider.GetRequiredService<MyViewModel1>()
MyViewModel1
потребуется иногда использовать MyViewModel2
и MyViewModel3
, поэтому мне нужно вызвать GetRequiredService
для них, и это делается путем присвоения serviceProvider
внутреннему статическому свойству, например Configuration.ServiceProvider
, что MyViewModel1
затем использует.
Мне это не нравится. Если я включу MyViewModel2/3
в качестве зависимостей для MyViewModel1
, это работает нормально, но эти классы не всегда нужны; Я буду строить объекты, даже если они не видят смысла.
Вместо этого я хочу составить ViewModelProvider / Locator и загрузить его в serviceProvider, например,
public class MyViewModelProvider : IMyViewModelProvider
{
private ServiceProvider _serviceProvider;
public MyViewModel2 MyViewModel2 =>_serviceProvider.GetRequiredService<MyViewModel2>();
public MyViewModelProvider(ServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
}
и затем MyViewModel1
использует это как зависимость, запрашивая MyViewModel2
только при необходимости.
Но теперь я создал проблему курица / яйцо. MyViewModelProvider
необходимо добавить к ServiceCollection
, но также необходимо, чтобы ServiceCollection была встроена в ServiceProvider и передана в качестве параметра.
Я мог бы попытаться обмануть, загрузив его в коллекцию сервисов с пустым конструктором и использовать что-то вроде MyViewModelProvider.Init(serviceProvider)
, но это все равно похоже на анти-шаблон.
Должен ли я просто укусить и дать MyViewModel2/3
MyViewModel1
или этот подход MyViewModelProvider
даже жизнеспособен?