模拟和实体框架

时间:2010-09-06 02:35:14

标签: .net entity-framework architecture

我来自开发业务应用程序的背景,因此习惯了MVC / n-tier开发。

我的大多数应用程序都有这样的架构:

GUI -> BL (which deals with entities) -> DAL (SQL DB)

现在,我想写一些在交互式故事和模拟之间交叉的东西 - 有一个持久的“世界”,它允许你影响对象/ NPC。对象/ NPC的状态随着时间的推移而变化(有时是由于您的操作),这会影响以后的选项。想想 Oblivion ,但规模要小得多,无战斗

我知道这是一个庞大的项目,我知道我自己无法实现现代游戏的复杂性 - 但这并不意味着我不应该尝试:)

我的问题是:我应该使用什么样的架构?

我需要一个故事元素库 - 角色(NPC),地点,交通机制,物品,任务等等。

我自然倾向于将这些存储在SQL数据库中并使用实体框架访问它们。

然后我需要能够对这些元素执行操作/事件。这是我不清楚的地方。我常用的方法是让(比方说)一个NPCManager,它可以有操作NPC实体的方法 - 但是这对多态无效。

我想我;我需要使用继承(接口)来处理每个元素将具有的所有功能。例如:

  • 元素(故事元素的基础对象 - 相当于.Net中的Object
  • NPC(继承元素)
  • Guard(继承NPC)
  • MountedGuard(继承守卫)
  • 等...

我可以说:

  • 所有元素都有一个id
  • 所有NPC都会有一个ID和一个名字
  • 所有卫兵都有身份,姓名和忠诚
  • 所有MountedGuards都有id,name,allegiance和mount

这似乎与EF没有很好的融合 - 例如我没有NPCManager.GiveClothing(NPC as NPC, ClothingItem as Clothing)的方法 - 因为传递MountedGuard会失败(特别是,该类将被视为NPC对数据库没有意义......)

我觉得我应该有专门针对MountedGuard对象处理MountedGuards的方法 - 而不是在Guard或NPC管理器上。

我是否应该有一组用于存储信息的实体和一组完全独立的类来表示实体存储的对象数据。例如:

Entities.MountedGuard
Elements.MountedGuard - same properties as Entities.MountedGuard but also has a `Dismount()` method which affects the associated entity?

我应该使用非POCO实体吗?或根本没有实体(在这种情况下,我如何定义“世界”?我绝对不希望在代码中完成所有操作)

目前,我甚至没有考虑如何向用户显示这些元素 - 目前,简单的文字似乎很可能

如果有人可以请我指出适当的架构或一些好的资源。

非常感谢

1 个答案:

答案 0 :(得分:1)

我的0.02美元:您可以在实体框架中拥有多个继承策略,请参阅here;这将允许您根据需要对域进行建模 - 我特别看到Table-Per-Type(而不是table-per-concrete-type)对您有用;这意味着代码中的继承结构将由数据库以非常不言自明的结构进行密切镜像。从哪里拿出它取决于你,但关键是你可以使用与任何面向对象的代码几乎相同的策略。