C# Zenject的双容器分层体系结构
在我的应用程序中,我有三个层: *数据实体和数据访问对象 *模型经理 *演示视图 我决定选择分包商 在根游戏安装程序中,我创建每个容器,并使用LayerInstaller手动安装它们:C# Zenject的双容器分层体系结构,c#,unity3d,zenject,C#,Unity3d,Zenject,在我的应用程序中,我有三个层: *数据实体和数据访问对象 *模型经理 *演示视图 我决定选择分包商 在根游戏安装程序中,我创建每个容器,并使用LayerInstaller手动安装它们: public class GameInstaller : MonoInstaller { public GameDataLayerInstaller DataLayerInstaller; public GameModelLayerInstaller ModelLayerInstaller;
public class GameInstaller : MonoInstaller
{
public GameDataLayerInstaller DataLayerInstaller;
public GameModelLayerInstaller ModelLayerInstaller;
public GamePresentationLayerInstaller PresentationLayerInstaller;
public override void InstallBindings()
{
var dataContainer = Container.CreateSubContainer();
dataContainer.Inject(DataLayerInstaller);
DataLayerInstaller.InstallBindings();
var modelContainer = dataContainer.CreateSubContainer();
modelContainer.Inject(ModelLayerInstaller);
ModelLayerInstaller.InstallBindings();
var presentationContainer = modelContainer.CreateSubContainer();
presentationContainer.Inject(PresentationLayerInstaller);
PresentationLayerInstaller.InstallBindings();
}
}
在模型安装程序中,我将GameAppManager添加到图形中
public class GameModelLayerInstaller : MonoInstaller
{
public GameAppManager GameAppManager;
public override void InstallBindings()
{
Container.BindInstance(GameAppManager);
Container.QueueForInject(GameAppManager);
}
}
public class GamePresentationLayerInstaller : MonoInstaller
{
public GameApp GameApp;
public override void InstallBindings()
{
Container.BindInstance(GameApp);
Container.QueueForInject(GameApp);
}
}
在演示安装程序中,我将GameApp添加到图形中
public class GameModelLayerInstaller : MonoInstaller
{
public GameAppManager GameAppManager;
public override void InstallBindings()
{
Container.BindInstance(GameAppManager);
Container.QueueForInject(GameAppManager);
}
}
public class GamePresentationLayerInstaller : MonoInstaller
{
public GameApp GameApp;
public override void InstallBindings()
{
Container.BindInstance(GameApp);
Container.QueueForInject(GameApp);
}
}
然后我试图从GameApp.InjectDependencies解决它。。。方法:
但是Zenject抛出了这个异常:
ZenjectException: Unable to resolve type 'RsQuest.Game.Model.App.GameAppManager' while building object with type 'RsQuest.Game.Presentation.App.GameApp'.
Object graph:
GameApp
我如何处理这个案子?GameObjectContext有什么更好的方法吗?我对发生的事情的最好猜测是GameApp被注入了两次。一次按演示文稿容器,一次按SceneContext容器。默认情况下,场景中的任何单一行为都假定属于SceneContext,除非它们位于GameObjectContext中。所以你是对的,我认为最好的方法就是使用GameObjectContext。通常,您不需要自己调用DiContainer.CreateSubContainer 如果在启动时场景中已经有了想要位于子容器中的单行为,则可以直接为这些对象添加GameObjectContext父变换。或者,如果它们是动态创建的,则可以将FromSubcainerResolve.ByNewPrefablex方法之一用作工厂或直接在场景容器上使用