[英]How to configure zero or one to zero or one relationship with bi-directional navigation with FluentAPI
[英]How to properly have an automatically updating one-to-many bi-directional relationship in C#
在示例游戏引擎服务器中,游戏世界可以由世界对象表示。 游戏可能有多个游戏世界,一个世界中的玩家只需要接收该世界中单位的位置数据即可。
class World
{
public List<Unit> Units { get; set; }
}
但是,一段代码也需要能够轻松查找单元所在的世界,因此单元对象本身可以跟踪世界参考。
class Unit
{
public World World { get; set; }
}
这适用于查找,但是当程序员不知道正在进行的对象之间的关系时,在更改数据时很快会出现问题,因此我将World
Units
更改为只读,并在Unit
包含以下代码。
public virtual World World
{
get { return _world; }
set
{
// Unit must always be in a world
Contract.Requires<ArgumentNullException>(value != null);
// If already this, don't do anything
if (value == _world) return;
var oldWorld = _world;
_world = value;
if(oldWorld != null) oldWorld.UpdateUnitEntry(this);
_world.UpdateUnitEntry(this);
}
}
这行得通,但感觉有更好的方法来做到这一点。 尤其是当我添加了更多需要以相同方式链接的内容(一个World
也具有Structure
和Player
)时,引入了许多重复的功能。是否有更好的方式来实现这种一对多关系而无需手动更新双方?
在像C ++这样的语言中,它们没有如此出色的引用管理和GC,无论如何,像这样的循环引用都是一个问题(例如SharedPtr)。 例如游戏状态的序列化也存在问题。
这使我相信,可能有更好的方法来解决该问题。 例如,部队真的需要了解他们的世界吗? 也许看一下使您认为自己需要它的代码,也许您可以以不再需要的方式对其进行更改。
因此,也许实施一个实体管理系统,并且仅通过抽象ID或句柄引用您的游戏实体。 在不充当任何对象但没有实体的情况下,请先解析ID /句柄,然后再保留实体对另一个实体的引用。 如果您发现自己想要序列化游戏的状态,这也将大有帮助。
除此以外:
您所做的并不是严格的错误或其他任何事情。 如果它正在工作并且没有太大的痛苦,那就保持这种状态。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.