Могу ли я внедрить сервис, который обращается к ServiceProvider? - PullRequest
0 голосов
/ 30 октября 2018

У меня есть сервисная коллекция, подобная следующей

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 даже жизнеспособен?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...