Почему Zenject не может разрешить зависимости в SubContainer?

Как можно переписать код конструкторов классов Test1 и Test2, чтобы они работали в случае с такой конфигурацией, и какие изменения нужно внести в методы InstallBindings и SimpleInstaller?
  • 28 декабря 2023 г. 6:37
Ответы на вопрос 1
Zenject не может разрешить зависимости в SubContainer по нескольким причинам:

1. Неправильная конфигурация: Если не указаны или неправильно указаны биндинги для зависимостей в SubContainer, Zenject не сможет разрешить их.

2. Отсутствие биндингов: Если биндинги для зависимостей были установлены неправильно или не полностью, Zenject не сможет предоставить все необходимые зависимости.

3. Приоритеты биндингов: Если не указаны правильные приоритеты биндингов, Zenject может использовать неправильные зависимости при разрешении зависимостей в SubContainer.

Чтобы переписать код конструкторов классов Test1 и Test2 и сделать их работающими в случае с такой конфигурацией, вы можете внести следующие изменения:

1. Измените конструктор класса Test1 так, чтобы он принимал абстракции в качестве параметров зависимостей:

```csharp
public class Test1
{
    private readonly IDependencyA _dependencyA;
    private readonly IDependencyB _dependencyB;

    public Test1(IDependencyA dependencyA, IDependencyB dependencyB)
    {
        _dependencyA = dependencyA;
        _dependencyB = dependencyB;
    }

    // Добавьте остальной код класса
}
```

2. Измените конструктор класса Test2 так, чтобы он принимал абстракции в качестве параметров зависимостей:

```csharp
public class Test2
{
    private readonly IDependencyC _dependencyC;
    private readonly IDependencyD _dependencyD;

    public Test2(IDependencyC dependencyC, IDependencyD dependencyD)
    {
        _dependencyC = dependencyC;
        _dependencyD = dependencyD;
    }

    // Добавьте остальной код класса
}
```

3. В методе InstallBindings класса SimpleInstaller установите все необходимые биндинги для зависимостей в SubContainer:

```csharp
public class SimpleInstaller : MonoInstaller
{
    public override void InstallBindings()
    {
        // Установка биндингов для зависимостей в текущем контейнере

        // Установка биндингов для зависимостей в SubContainer
        SubContainerInstaller.Install<SubContainerInstaller>(Container);
    }
}
```

4. В методе InstallBindings класса SubContainerInstaller установите биндинги для зависимостей в SubContainer:

```csharp
public class SubContainerInstaller : MonoInstaller
{
    public override void InstallBindings()
    {
        // Установка биндингов для зависимостей в текущем контейнере

        // Установка биндингов для зависимостей в SubContainer
        Container.Bind<IDependencyA>().To<DependencyA>().AsSingle();
        Container.Bind<IDependencyB>().To<DependencyB>().AsSingle();
        Container.Bind<IDependencyC>().To<DependencyC>().AsSingle();
        Container.Bind<IDependencyD>().To<DependencyD>().AsSingle();
    }
}
```

После внесения этих изменений Zenject должен корректно разрешить зависимости в SubContainer и создать экземпляры классов Test1 и Test2 с правильными зависимостями.
Похожие вопросы