1

我在我的游戏中使用 Zenject 进行依赖注入,我陷入了僵局。

让我描述一下我当前的设置:

我有几个自己的角色,GameObjectContext负责CharacterInstaller将 aCharacterController注入到CharacterPresenter.

public class CharacterInstaller : MonoInstaller<CharacterInstaller>
{
    public override void InstallBindings()
    {
        Container.BindInterfacesAndSelfTo<CharacterInstaller>().AsSingle().NonLazy();
    }
}
// PLAIN C# class
public class CharacterController : <some_interfaces>
{
    public void Foo()
    {
        // ...
    }
}
public class CharacterPresenter : MonoBehaviour
{
    private CharacterController characterController;

    [Inject]
    public void InjectDependencies( CharacterController characterController )
    {
        this.characterController = characterController;
    }

    public void Foo() => characterController.Foo();
}

我想做的是将CharacterController类的所有实例也注入到使用List Bindings的“管理器”类中。这位经理不是我角色的父母,我可能需要几个经理。

public class CharactersManager
{
    private List<Character> characters;

    public CharactersManager( List<Character> characters)
    {
        this.characters = characters;
    }

    public void MakeCharactersDoSomething()
    {
        foreach ( Character character in characters)
            character.Foo();
    }
}

我发现解决我的问题的更接近的事情是:

• 将ZenjectBinding组件附加到我的角色并指定我需要的上下文。
→ 不能工作,因为CharacterController它是一个普通的 C# 类并且ZenjectBinding唯一绑定组件

Context•在CharacterInstallerand 调用中声明 a OtherContext.Container.Bind...
→ 失败,因为OtherContext.Container为空

• 调用Container.Bind<CharacterController>().FromComponentsInHierarchy()我的经理安装程序
→ 不工作,因为CharacterController不是组件

• 使用工厂
→ 我不能使用它,因为我的对象是在编辑时放置在编辑器中的

Container.ParentContainers在我中使用CharacterInstaller
→ 无法使用,因为我的经理不是我的父容器CharacterInstaller.Container

我愿意接受建议,如果需要,可能会重构我的设置。提前致谢

4

1 回答 1

1

好吧,我找到了一个解决方案,但感觉不是很好。

在附加到场景上下文的安装程序中,绑定一个List<CharacterController>

public class GameInstaller : MonoInstaller<GameInstaller>
{
    public override void InstallBindings()
    {
        Container.Bind<List<CharacterController>>().AsSingle();
    }
}

并在 中CharacterInstaller,将实例化的字符添加到注入列表中

public class CharacterInstaller : MonoInstaller<CharacterInstaller>
{
    private List<CharacterController> characters;

    [Inject]
    public void InjectDependencies( List<CharacterController> characters )
    {
        this.characters = characters;
    }

    public override void InstallBindings()
    {
        Container.BindInterfacesAndSelfTo<CharacterInstaller>()
            .AsSingle()
            .OnInstantiated<CharacterController>( ( context, character ) => characters.Add( character ) )
            .NonLazy();
    }
}
于 2020-01-20T20:55:52.650 回答