Внедрение параметров времени выполнения объекта фасада IPoolable через установщик субконтейнера - PullRequest
0 голосов
/ 11 ноября 2019

Проблема в том, что я не получаю правильные значения в конструкторе установщика субконтейнера. Например, если я создаю свой пул FrontObject с фабрикой, как это: QuxFactory.Create(3.1415); Затем в конструкторе QuxInstaller я получаю 0 для параметра с плавающей запятой вместо 3.1415 .. Но я получаю ожидаемые результаты, если я не привязанмой QuxFactory как 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(). Если я здесь прав ..

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