因此,我有一个基类和一些派生类,我希望只有一个带有generic方法的工厂,它将创建适当的实例并注入所有依赖项。这有可能使用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;
}
}发布于 2018-04-29 07:08:42
我认为你拥有它的方式可能是最简单的方法。以下是你所做的一些小小的改变:
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中,但这可能会变得很混乱。
https://stackoverflow.com/questions/50072937
复制相似问题