C# Zenject的双容器分层体系结构

C# Zenject的双容器分层体系结构,c#,unity3d,zenject,C#,Unity3d,Zenject,在我的应用程序中,我有三个层: *数据实体和数据访问对象 *模型经理 *演示视图 我决定选择分包商 在根游戏安装程序中,我创建每个容器,并使用LayerInstaller手动安装它们: public class GameInstaller : MonoInstaller { public GameDataLayerInstaller DataLayerInstaller; public GameModelLayerInstaller ModelLayerInstaller;

在我的应用程序中,我有三个层: *数据实体和数据访问对象 *模型经理 *演示视图

我决定选择分包商

在根游戏安装程序中,我创建每个容器,并使用LayerInstaller手动安装它们:

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方法之一用作工厂或直接在场景容器上使用