【问题标题】:Can you have generic create method for Zenject你能有 Zenject 的通用创建方法吗
【发布时间】:2018-10-08 22:06:27
【问题描述】:

所以我有一个基类和一些派生类,我只想拥有一个具有通用创建方法的工厂,它将创建适当的实例并注入所有依赖项。这可能使用 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;
    }
}

【问题讨论】:

  • 你不能只做Create&lt;T&gt;() where T: BaseUnit,然后在你的方法中用typeof(T)替换所有type的用法吗?

标签: c# unity3d dependency-injection zenject


【解决方案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,但这可能会变得混乱

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-11
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 2011-01-28
    • 2021-02-18
    相关资源
    最近更新 更多