3

我正在编写 mmorpg 服务器仿真器(爱好项目)并且我已经停止编写数据访问层。问题是我不能使用 ORM(性能问题)。我已经阅读了很多关于 Repository 模式的内容,但它似乎不太适合我的项目,因为我需要以下方法:(player db) GetAllByLevel(...)、GetByName(...) 等。我希望我的应用程序与数据库无关。(我现在使用 sql server,但我想稍后添加对 mysql 的支持)哪种数据访问模式适合我的项目?

对不起,我的英语不好。

编辑

还有一个问题。我读过存储库模式在 agreggate 根上运行。我有 3 个表玩家,player_friend 和 player_chest。Player 是一个聚合根,如果我没记错的话,我应该只创建一个存储库 (PlayerRepository),它可能具有以下方法:GetFriends([player id], ...), GetChest([player id], ...)等等。我对吗?

4

2 回答 2

5

我已经阅读了很多关于 Repository 模式的内容,但它似乎不太适合我的项目,因为我需要以下方法:(player db) GetAllByLevel(...)、GetByName(...) 等。

相反。有很多错误的存储库模式示例(通常是泄漏的抽象)会教你错误。GetAllByLevel恕我直言,这是一个很好的方法,因为它非常清楚地描述了该方法的作用。

我写过关于存储库模式的文章:http: //blog.gauffin.org/2013/01/repository-pattern-done-right/。还请阅读文章开头的抽象链接。

问题是我不能使用 ORM(性能问题)。

没问题。存储库模式用于抽象出数据源,无论它是哪种类型。

如果你想使用 vanilla ADO.NET,你可以阅读这篇博文:http: //blog.gauffin.org/2013/01/ado-net-the-right-way/

还有一个问题。我读过存储库模式在 agreggate 根上运行。我有 3 个表玩家,player_friend 和 player_chest。Player 是一个聚合根,如果我没记错的话,我应该只创建一个存储库 (PlayerRepository),它可能具有以下方法:GetFriends([player id], ...), GetChest([player id], ...)等等。我对吗?

不,我会说 Friends 也是一个根。阅读这篇关于设计聚合的文章:http: //dddcommunity.org/library/vernon_2011

于 2013-01-14T06:40:31.293 回答
0

存储库是要走的路。关键是您可以拥有同一个存储库接口的多个实现,一个用于 sql server,另一个用于 oracle 或 postgresql。您不一定有一个支持所有可能数据库的通用实现(这将非常困难)。

具体实现可以使用具体 dbms 的任何特定功能来满足您的性能标准。

于 2013-01-12T12:01:32.100 回答