0

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

图片

我决定这SubContainers是我的选择。

在根目录GameInstaller中,我创建每个容器并使用 LayerInstallers 手动安装它们:

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();
    }
}

在 Model-Installer 内部,我添加GameAppManager到图表中。

public class GameModelLayerInstaller : MonoInstaller
{

    public GameAppManager GameAppManager;

    public override void InstallBindings()
    {
        Container.BindInstance(GameAppManager);
        Container.QueueForInject(GameAppManager);
    }
}

在 Presentation-Installer 中,我将 GameApp 添加到图表中。

public class GamePresentationLayerInstaller : MonoInstaller
{

    public GameApp GameApp;

    public override void InstallBindings()
    {
        Container.BindInstance(GameApp);
        Container.QueueForInject(GameApp);
    }
}

然后我试图从GameApp.InjectDependencies(...)方法中解决它:

public class GameApp : MonoBehaviour
{

    private GameAppManager _appManager;
    [Inject]
    public void InjectDependencies(GameAppManager appManager)
    {
        _appManager = appManager;
    }
}

但是 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 有没有更好的方法?

4

1 回答 1

1

我对正在发生的事情的最佳猜测是 GameApp 被注入了两次。一次由表示容器,一次由 SceneContext 容器。默认情况下,场景中的任何 MonoBehaviours 都假定属于 SceneContext,除非它们位于 GameObjectContext 中。所以你是对的,我认为做你想做的最好的方法是使用 GameObjectContext。通常你不需要自己调用 DiContainer.CreateSubContainer。

如果您在启动时已经在场景中获得了想要放在子容器中的 MonoBehaviours,那么您可以直接为这些对象添加 GameObjectContext 父变换。或者,如果它们是动态创建的,那么您可以使用 FromSubContainerResolve.ByNewPrefabX 方法之一,作为工厂或直接在场景容器上使用。

于 2017-10-26T12:28:44.267 回答