Можете ли вы иметь общий метод создания для Zenject

Итак, у меня есть базовый класс и несколько производных классов, я хочу иметь только одну фабрику с универсальным методом create, который создаст соответствующие экземпляры и внедрит все зависимости. Возможно ли это с помощью Zenject? Что-то вроде.

factory.Create<Archer>()

Пока я делаю это, но, как вы видите, это не очень чистое решение.

 public class CustomFactory : IFactory<Type, BaseUnit>
{
    private DiContainer _container;

    public CustomFactory(DiContainer container)
    {
        _container = container;
    }
    public BaseUnit Create<Type>()
    {
        return null;
    }

    public BaseUnit Create(Type type)
    {
        if (type.BaseType != typeof(BaseUnit))
        {
            Debug.LogError("you cant create objects that are not derrived from base unit");
            return null;
        }

        object obj = _container.Resolve(type) ;
        return _container.InstantiatePrefabForComponent(type, obj as UnityEngine.Object, null, new object[0]) as BaseUnit;
    }
}

1 ответ

Решение

Я думаю, что у вас это, наверное, самый простой способ сделать это. Вот некоторые незначительные изменения в том, что вы сделали:

public class UnitFactory
{
    readonly DiContainer _container;
    readonly List<UnityEngine.Object> _prefabs;

    public UnitFactory(
        List<UnityEngine.Object> prefabs,
        DiContainer container)
    {
        _container = container;
        _prefabs = prefabs;
    }

    public BaseUnit Create<T>()
        where T : BaseUnit
    {
        var prefab = _prefabs.OfType<T>().Single();
        return _container.InstantiatePrefabForComponent<T>(prefab);
    }
}

public class TestInstaller : MonoInstaller<TestInstaller>
{
    public FooUnit FooPrefab;
    public BarUnit BarPrefab;

    public override void InstallBindings()
    {
        Container.Bind<UnitFactory>().AsSingle();
        Container.Bind<UnityEngine.Object>().FromInstance(FooPrefab).WhenInjectedInto<UnitFactory>();
        Container.Bind<UnityEngine.Object>().FromInstance(BarPrefab).WhenInjectedInto<UnitFactory>();
    }
}

Единственный недостаток этого подхода заключается в том, что префабы не будут проверены, поэтому, если в них отсутствуют пропущенные инъекции, они не будут обнаружены до времени выполнения. Альтернативой может быть создание отдельных фабрик для каждого BaseUnit, а затем внедрение этих фабрик в UnitFactory, но это, вероятно, станет грязным

Другие вопросы по тегам