首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >您能为Zenject创建通用的创建方法吗?

您能为Zenject创建通用的创建方法吗?
EN

Stack Overflow用户
提问于 2018-04-28 04:45:29
回答 1查看 1.9K关注 0票数 4

因此,我有一个基类和一些派生类,我希望只有一个带有generic方法的工厂,它将创建适当的实例并注入所有依赖项。这有可能使用Zenject吗?就像。

代码语言:javascript
复制
factory.Create<Archer>()

现在,我正在这样做,但正如你们所看到的,这不是非常干净的解决方案。

代码语言:javascript
复制
 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;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-29 07:08:42

我认为你拥有它的方式可能是最简单的方法。以下是你所做的一些小小的改变:

代码语言:javascript
复制
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中,但这可能会变得很混乱。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50072937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档