C# 将相同类型的模型映射到视图实例

C# 将相同类型的模型映射到视图实例,c#,dependency-injection,unity3d,inversion-of-control,C#,Dependency Injection,Unity3d,Inversion Of Control,我在我的游戏中使用了,我在解决如何将视图映射到模型时遇到了问题 在游戏开始时,我创建了几个敌人模型。这些模型包含操作期间使用的各种统计数据(例如伤害量、生命值等)。我使用命令对这些统计数据进行操作。然后,我在Start命令中遍历所有模型,并为它们创建适当的视图。每个EnemyView都有一个EnemyMediator,它应该触发用于管理AI的命令 我需要一种方法来告诉视图它们属于哪个模型实例。奇怪的IOC注入绑定通常通过类型或可选的附加标识符来区分。我所有的敌人模型和视图都是相同的类型,所以我必

我在我的游戏中使用了,我在解决如何将视图映射到模型时遇到了问题

在游戏开始时,我创建了几个敌人模型。这些模型包含操作期间使用的各种统计数据(例如伤害量、生命值等)。我使用命令对这些统计数据进行操作。然后,我在Start命令中遍历所有模型,并为它们创建适当的视图。每个
EnemyView
都有一个
EnemyMediator
,它应该触发用于管理AI的命令

我需要一种方法来告诉
视图
它们属于哪个
模型
实例。奇怪的IOC注入绑定通常通过类型或可选的附加标识符来区分。我所有的敌人模型和视图都是相同的类型,所以我必须使用这个标识符。当尝试实际注入实例时,问题就出现了

我最初尝试给我的每个敌人模型一个GUID,并将其传递给
视图
中介
,但问题来自奇怪的IOC注入使用静态注入标准这一事实。尝试在
Inject
属性中应用我的GUID会引发编译器错误,原因很明显

这导致我使用
InjectionBinder.Injector.Injector()
在使用GUID执行
命令的过程中手动获取绑定。这是可行的,但现在它增加了对注入器的依赖性,我不需要这种依赖性,我基本上是将注入器用作服务定位器,并且失去了注入器的好处

问题是,我不知道如何将my
EnemyView
所属的特定模型注入到我发出的命令中,因此我只能使用服务定位器样式的解决方法

供参考:


是我试图遵循的应用程序结构。

我已经设法想出了一个选项

对于每个敌人:

  • 创建敌人模型
  • 为每个敌人创建单独的上下文,并将模型存储在 在那里
  • 在EnemyView类型和 敌人上下文中的EnemyMediator类型
  • 从上下文中创建敌人视图
然后,上下文将创建敌方调解员,并将敌方模型绑定到敌方调解员中

此解决方案的缺点是:

  • 它引出了许多上下文,这些上下文带来了它们自己的上下文 注射粘合剂等
  • 它导致大量使用跨语境 绑定,可能会污染该绑定空间。这可能是 通过修改上下文以使用分层查找(我 可能在今天晚些时候尝试这样做),然后再查看交叉上下文 活页夹

  • 这不是一个直接的解决方案,但这就是我解决这个问题的方法。我为所有敌人创建了一个单例模型。该模型包含一个字典,其中键是view.GetInstanceID(),值是一个类,该类保存该特定对象的统计信息

    public class EnemyModel : IEnemyModel
    {
        // int is the id of the enemy's instance id in the view i.e. view.GetInstanceID()
        public IDictionary<int,Enemy> enemyDict {get;set;}
    
        public EnemyModel ()
        {
            enemyDict = new Dictionary<int,Enemy>();
        }
    }
    
    public class Enemy
    {
        public bool  isDangerous = false;
        public float health = 1;
    }
    
    公共类EnemyModel:IEnemyModel
    {
    //int是视图中敌人实例id的id,即view.GetInstanceID()
    公共IDictionary enemyDict{get;set;}
    公共EnemyModel()
    {
    enemyDict=新字典();
    }
    }
    公敌
    {
    公共布尔值为危险=错误;
    公共卫生=1;
    }
    
    我也有同样的问题要解决,这是我提出的解决方案

    EnemyMediator对敌人有参考价值(但不是注射的,甚至可能是私人的)。 EnemyMediator需要有一些作为当前敌人的单体博弈模型

    现在,当您在某个命令中创建一个敌人时,您将实例化一个敌人(注入游戏模型),您首先创建模型,并将其添加到游戏模型的currentDebust值中。现在实例化视图

    在构造后方法中,从游戏模型中读取当前敌人值,并将其设置在Mediator中

    当你发射一个信号/事件时,你把敌人作为一个参数。现在,该命令具有关于模型的信息


    我不喜欢在调解员中添加模型,但我还没有找到更好的解决方案。

    我在试图了解国际奥委会内部模型的适用性时遇到了你们同样的疑问和问题。 所以,在阅读文档时,我读到了类似“模型类似于价值对象(VO)”。 所以我提出了这个解决方案,同时也利用了团结的潜力。 以下是我的设计和示例:

    • 我创建了一个单行为的“EnemyModel”类,并实现了一个通用的IEnemyModel接口

    • 在场景加载过程中,在上下文的StartCommand中,我使用AddComponent向每个EnemyView添加一个EnemyModel。每个EnemyModel的数据都是从描述场景数据属性的文件或数据库加载的

    • 中介有对EnemyView和EnemyModel的引用(通过接口)

    • 当在中介中调度命令时(我使用信号),EnemyModel将作为参数传递

    • 在命令中,我引用了作为参数传递的数据,因此命令已经知道要处理的数据,并且它实际上正在处理模型

    我认为这样比传递某种ID并试图通过数据管理器解析数据更好。此外,如果EnemyModel是附加到EnemyView游戏对象的单一行为,则更容易从编辑器中调试其值


    您认为如何?

    成功地实现了分层绑定,因此许多上下文不再像以前那样不受欢迎。我仍然想知道是否有更好的解决方法。这也是我曾经玩过的一个解决方案,我非常喜欢只注入组件需要的信息的想法,因此层次模型更适合它,但这肯定是一个更快更直观的系统,