【问题标题】:Using Zenject to inject an implementation with interfaces使用 Zenject 注入带有接口的实现
【发布时间】:2021-03-20 13:15:28
【问题描述】:

我正在尝试在 Unity 中使用 Zenject。我有一个接口和它的几个实现。

我想用 ID 进行注入,但由于它不是 MonoBehaviour,所以实现将具有 tick 接口。

所以我有一个IAttacker 接口和一个MeleeAttackImpl 实现。

Container.Bind<IAttacker>().WithId(AttackerTypeEnum.MELEEE).To<MeleeAttackImpl>().AsTransient();

我要添加

Container.BindInterfacesTo<MeleeAttackImpl>().AsTransient();

但它会创建 2 个不同的对象而不是具有 Tick 接口的实例并将它们绑定到 IAttacker

【问题讨论】:

    标签: unity3d dependency-injection zenject


    【解决方案1】:

    如果要将接口绑定到确定的实现,为什么要使用两个绑定? 如果您只想要一个对象实例,我会尝试: Container.BindInterfacesAndSelfTo&lt;MeleeAttackImpl&gt;().AsSingle(); 要么: Container.Bind&lt;IAttacker&gt;().To&lt;MeleeAttackImpl&gt;().AsSingle();

    As Single() 如果您需要从应用程序中的容器提供的相同实例(如单例)。

    来自文档: “AsTransient - 根本不会重复使用实例。每次请求 ContractType 时,DiContainer 都会再次执行给定的构造方法。”

    很多时候实例是在绑定本身中创建的。所以可能从两个绑定中创建了两个实例,每个绑定一个。

    如果您需要动态创建实例并解决所有依赖关系,您需要的是工厂。

    【讨论】:

    • 我想要的不是 AsSingle。我确实希望 Zenject 为每个 IAttacker 创建一个新实例,但我希望这个实例具有 Tick() 接口
    • 您的班级是否实施了 ITickable? (MeleeAttackImpl: ITickable)。您需要在您的类中实现它,并在容器中绑定以使滴答发生
    • 我从来没有使用过ToTrasient,以防万一这是导致您的问题的原因。 This 可能会有所帮助。
    • 是的,它已实现。但据我了解,实施是不够的。您还需要在 Installer 中绑定接口
    • 是的,实现它,并将其绑定到容器Container.Bind&lt;ITickable&gt;().To&lt;MeleeAttackImpl&gt;(),或者与BindInterfacesAndSelfTo。您在上一条评论的链接中获得了一些提示。试一试
    猜你喜欢
    • 1970-01-01
    • 2016-07-25
    • 2014-08-08
    • 2019-04-09
    • 2012-06-12
    • 1970-01-01
    • 2015-04-26
    • 2013-04-11
    • 2019-10-28
    相关资源
    最近更新 更多