0

问题是我在子容器安装程序构造函数中没有得到正确的值。例如,如果我用这样的工厂创建我的可池外观对象:QuxFactory.Create(3.1415);然后在 QuxInstaller 构造函数中,我得到 0 作为浮点参数而不是 3.1415.. 但是如果我没有绑定我的QuxFactorylike ,我会得到预期的结果FromPoolableMemoryPool。所以我很困惑如何在子容器安装程序中获取我的参数以进一步注入子容器的依赖项?

这是我正在玩的 Extenject 文档中的代码:

我有我的工厂注入,我正在实例化这样的新实例

_shipFactory.Create(Random.RandomRange(2, 20));
public class GameInstaller : MonoInstaller
{
    [SerializeField] private Object[] shipPrefabs;

    public override void InstallBindings()
    {
        Container.BindInterfacesTo<GameRunner>().AsSingle();

        Container.BindFactory<float, ShipFacade, ShipFacade.Factory>().
        FromPoolableMemoryPool(x => x.WithInitialSize(2).FromSubContainerResolve().
        ByNewPrefabInstaller<ShipInstaller>(GetPrefab));
    }

    private Object GetPrefab(InjectContext context)
    {
        return shipPrefabs[Random.Range(0, shipPrefabs.Length)];
    }
}

public class ShipFacade : IPoolable<float, IMemoryPool>, IDisposable
{
    private IMemoryPool _memoryPool;
    private float _speed;
    ...
    blah
    ...

    public void OnSpawned(float speed, IMemoryPool memoryPool)
    {
        _memoryPool = memoryPool;
        _speed = speed; //here I'm getting correct value
    }

    public void Dispose()
    {
        _memoryPool.Despawn(this);
    }

    public class Factory : PlaceholderFactory<float, ShipFacade>
    {
    }
}

public class ShipInstaller : Installer<ShipInstaller>
{
    private readonly float _speed;

    public ShipInstaller([InjectOptional] float speed)
    {
        Debug.Log(speed); // here I'm getting 0 !, instead of Random between 2 : 20
        _speed = speed;
    }

    public override void InstallBindings()
    {
        Container.Bind<ShipFacade>().AsSingle();
        Container.Bind<Transform>().FromComponentOnRoot();
        Container.BindInterfacesTo<ShipInputHandler>().AsSingle();
        Container.BindInstance(_speed).WhenInjectedInto<ShipInputHandler>();
        Container.Bind<ShipHealthHandler>().FromNewComponentOnRoot().AsSingle();
    }
}

此外,当我将 float 注入到 ShipInputHandler 时,它注入为 0;

而且我认为这一行的文档页面中有一个“错字”:

Container.BindFactory<Vector3, Foo, Foo.Factory>().
FromMonoPoolableMemoryPool<Foo>(x => x.WithInitialSize(2).
FromComponentInNewPrefab(FooPrefab).UnderTransformGroup("FooPool"));

它不适用于FromMonoPoolableMemoryPool<Foo>(),因为我们有一个参数 Vector3。它应该是FromMonoPoolableMemoryPool<Vector3, Foo>()FromMonoPoolableMemoryPool()。如果我在这里是正确的..

4

1 回答 1

0

由于池已经创建了实例,因此我必须在OnSpawned(Vector3 param, IMemeoryPool pool). 为此,需要将依赖项(在我的情况下为 ShipInputHandler)注入到 ShipFacede 中,并在 OnSpawned 方法中执行以下操作:

public void OnSpawned(float speed, IMemoryPool memoryPool)
{
    _memoryPool = memoryPool;
    _speed = speed;

    _shipInputHandler.Initialize(speed);
}

或者我想也可以通过 FromResolveGetter 从工厂绑定它。

于 2019-11-13T23:42:41.327 回答